第十一届蓝桥杯校内赛/校内选拔赛(2020蓝桥杯校选4-c)部分解题思路

1、问题描述测试

一个数被称为质数(或素数)是指除开1和它自己两个约数外,没有其余的约数。
在不超过10000的数中,一共有多少个质数?加密

1229code

2、问题描述qt

1200000有多少个约数(只计算正约数)。io

96class

3、问题描述 二叉树

将LANQIAO中的字母从新排列,能够获得不一样的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不必定有具体的英文意义。
请问,总共能排列如多少个不一样的单词。程序

1800密码

 4、问题描述 技术

一个包含有2019个结点的二叉树,最少有多少层?
注意当一棵二叉树只有一个结点时为一层。

10

5、问题描述 

给定一个单词,请使用凯撒密码将这个单词加密。
凯撒密码是一种替换加密的技术,单词中的全部字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,...,w变为z,x变为a,y变为b,z变为c。
例如,lanqiao会变成odqtldr。
输入格式:
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式:
  输出一行,表示加密后的密文。
样例输入:
lanqiao
样例输出:
odqtldr
评测用例规模与约定:
  对于全部评测用例,单词中的字母个数不超过100。

#include<stdio.h>
int main(){
	char arr[100];
	scanf("%s",&arr);
	char *key="defghijklmnopqrstuvwxyzabc";
	int i;
	for(i=0;arr[i]!='\0';i++){
		arr[i]=key[(int)arr[i]-'a'];
	}
	printf("%s",&arr);
	return 0;
}

6、问题描述 

小明很是不喜欢数字 2,包括那些数位上包含数字 2 的数。若是一个数的数位不包含数字 2,小明将它称为洁净数。
请问在整数 1 至 n 中,洁净数有多少个?
输入格式:
  输入的第一行包含一个整数 n。
输出格式:
  输出一行包含一个整数,表示答案。
样例输入:
30
样例输出:
18
评测用例规模与约定:
  对于 40% 的评测用例,1 <= n <= 10000。
  对于 80% 的评测用例,1 <= n <= 100000。
  对于全部评测用例,1 <= n <= 1000000。

#include<stdio.h>
int main(){
	int i,n,num=0,flag,g=0,s=0,b=0,q=0,w=0,sw=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		flag=0;
		g=i%10;
		s=i%100/10;
		b=i%1000/100;
		q=i%10000/1000;
		w=i%100000/10000;
		sw=i%1000000/100000;
		if(g==2||s==2||b==2||q==2||w==2||sw==2){
			flag=1;
		}
		if(flag==0){
			num++;
		}
	}
	printf("%d",num);
	return 0;
}

7、问题描述 

输入一个单词,请输出这个单词中第一个出现的元音字母。
元音字母包括 a, e, i, o, u,共五个。
输入格式:
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式:
  输出一行包含一个字母,为单词中第一个出现的元素字母。若单词中不存在元音字母,输出字母n。
样例输入:
hello
样例输出:
e
样例输入:
fly
样例输出:
n
评测用例规模与约定:
  对于全部评测用例,单词中的字母个数不超过100。

#include<stdio.h>
int main(){
	char arr[100];
	int i,flag=0;
	scanf("%s",&arr);
	for(i=0;arr[i]!='\0';i++){
		if(arr[i]=='a'||arr[i]=='e'||arr[i]=='i'||arr[i]=='o'||arr[i]=='u'){
			printf("%c",arr[i]);
			flag=1;
			break;
		}
	}
	if(flag==0){
		printf("n");
	}
	return 0;
}

 8、问题描述 

小明开了一家花店,这天,有个客户定了很是多的花,按客户的须要,这些花要排成 n 行 m 列。
小明要将这些花运送到客户那,然而因为花太多,须要分两辆车才能装下。
小明怕本身弄错花的顺序,所以在分车的时候,他准备将前面一些列(注意不是行)的花放在第一辆车上,将其实的花放在第二辆车上。
已知每盆花的重量,要使第一辆车和第二辆车尽量总重量一致,请帮助小明分装这些花,请告诉小明两辆车的重量最小差多少。
输入格式:
  输入的第一行包含两个整数 n, m,分别表示行数和列数。
  接下来 n 行,每行 m 个正整数,分别表示每盆花的重量。
输出格式:
  输出一个整数,表示总重量最接近时两车的重量之差(的绝对值)。
样例输入:
3 4
1 2 3 9
5 6 7 8
2 3 4 9
样例输出:
7
样例说明:
  将前 3 列放一辆车,后 1 列放一辆车,第一辆比第二辆重 7 。
评测用例规模与约定:
  对于 30% 的评测用例,2 <= n, m <= 20。
  对于 70% 的评测用例,2 <= n, m <= 100。
  对于全部评测用例,2 <= n, m <= 1000,每盆花的重量不超过 1000。

#include<stdio.h>
#include<math.h>
int arr[1000];
int main(){
	int i,j,n,m,left=0,right=0,temp,f,l;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			scanf("%d",&temp);
			arr[j]+=temp;
		}
	}
	l=m-1;
	f=0;
	for(i=0;i<m;i++){
		if(left > right){
			right+=arr[l];
			l--;
		}else{
			left+=arr[f];
			f++;
		}
	}
	printf("%d",abs(right-left));
	return 0;
}

  9、问题描述 

一个平面向量表示从一个坐标点到另外一个坐标点的变化量,通常用两个数 (x, y) 来表示。
两个向量相加是指分别将对应的两个数相加,例如 (x_1, y_1) 与 (x_2, y_2) 相加后得 (x_1+x_2, y_1+y_2)。
若是两个向量相加后,获得的向量两个值相等,咱们称这两个向量为和谐向量对。例如 (3, 5) 和 (4, 2) 是和谐向量对。
给定 n 个向量,问能找到多少个和谐向量对?
输入格式:
  输入的第一行包含一个整数 n,表示向量的个数。
  接下来 n 行,每行两个整数 x_i, y_i,表示一个向量。
输出格式:
  输出一行,包含一个整数,表示有多少个和谐向量对。
  请注意,本身和本身不能成为一个和谐向量对。
样例输入:
5
9 10
1 3
5 5
5 4
8 6
样例输出:
2
样例输入:
4
1 1
2 2
1 1
2 2
样例输出:
6
样例说明:
  每两个向量组成一个和谐向量对。
评测用例规模与约定:
  对于 70% 的评测用例,1 <= n <= 1000;
  对于全部评测用例,1 <= n <= 100000,-1000000 <= x_i, y_i <= 1000000。
  请注意答案可能很大,可能须要使用 long long 来保存。

#include<stdio.h>
int arr[1000][2];
int main(){
	int i,j,n;
	long long ans=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<2;j++){
			scanf("%d",&arr[i][j]);
		}
	}
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			if(arr[i][0]+arr[j][0]==arr[i][1]+arr[j][1]){
				ans++;
			}
		}
	}
	printf("%lld",ans);
	return 0;
}

  10、问题描述 

给出三个水杯,大小不一,而且只有最大的水杯的水是装满的,其他两个为空杯子。
三个水杯都没有标刻度线,在水杯之间能够相互倒水。当从一个杯子向另外一个杯子倒水时,只能将一个杯子的水倒空或者将另外一个杯子的水倒满。不容许倒到三个杯子之外的地方。
给定一个目标状态,请写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入格式:
  输入的第一行包含一个整数 n,表示总共有 n 组测试数据。
  接下来每组测试数据包含两行,第一行包含三个整数 V_1,V_2,V_3,分别表示三个水杯的体积。
  每组数据的第二行包含三个整数E_1,E_2,E_3(体积小于等于相应水杯体积)表示最终状态。
输出格式:
  输出 n 行,每行对应一组数据的结果。
  若是能够达到最终状态,输出最少的倒水次数,若是不能达到目标准备,输出-1。
样例输入:
2
6 3 1
4 1 1
9 3 2
7 1 1
样例输出:
3
-1
评测用例规模与约定:
  对于全部评测用例,0<n<=50,0<V_3<V_2<V_1<=100,0<=E_1<=V_1,0<=E_2<=V_2,0<=E_3<=V_3,E_1+E_2+E_3=V_1。

#include<stdio.h>
int ans[50];
int main(){
	int i,n,cup1,cup2,cup3,water1,water2,water3,temp;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d%d%d",&cup1,&cup2,&cup3);
		scanf("%d%d%d",&water1,&water2,&water3);
		if(water1+water2+water3!=cup1){
			ans[i]=-1;
			continue;
		}
		if(water3>water2){
			water3=temp;
			water3=water2;
			water2=temp;
			cup3=temp;
			cup3=cup2;
			cup2=temp;
		}
		if(water2==cup2){
			ans[i]++;
			if(water3==water3){
				ans[i]++;
			}else{
				if(water3==cup2%cup3){
					ans[i]+=(cup2/cup3+1)*2;
				}else if(water3!=0){
					ans[i]=-1;
					continue;
				}
			}
		}else{
			if((cup2-water2)%cup3==0){
				if(water2%cup3==0){
					if(water3==cup3){
						if(((cup2-water2)/cup3)*2>(water2/cup3)*2+1){
							ans[i]+=(water2/cup3)*2+1;
						}else{
							ans[i]+=((cup2-water2)/cup3)*2;
						}
					}else if(water3==0){
						if(((cup2-water2)/cup3)*2+1>(water2/cup3)*2){
							ans[i]+=(water2/cup3)*2;
						}else{
							ans[i]+=((cup2-water2)/cup3)*2+1;
						}
					}else{
						ans[i]=-1;
						continue;
					}
				}else{
					ans[i]++;
					ans[i]+=((cup2-water2)/cup3)*2;
					if(water3==cup3){
						ans[i]--;
					}else if(water3!=0){
						ans[i]=-1;
						continue;
					}
				}
			}else if(water2%cup3==0){
				if(water3==cup3){
					ans[i]+=(water2/cup3)*2+1;
				}else if(water3==0){
					ans[i]+=(water2/cup3)*2;
				}else{
					ans[i]=-1;
					continue;
				}
			}else{
				ans[i]=-1;
				continue;
			}
		}
	}
	for(i=0;i<n;i++){
		printf("%d\n",ans[i]);
	}
	return 0;
}