2022年6月青少年软件编程C语言三级真题及答案

1.制作蛋糕

小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉,250个单位的面粉,75个单位的糖,100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉,200个单位的面粉,150个单位的糖,150个单位的黄油。一个香蕉蛋糕可以卖出400元,而一个巧克力蛋糕可以卖出450元。为了避免蛋糕变质,每种蛋糕至多只能制作100个。
现已知每种原料的数量,求小A至多可以卖出多少元的蛋糕。
时间限制:1000
内存限制:65536
输入
依次输入面粉、香蕉、糖、黄油、可可粉的数量,每种原料数量均为不超过100000的整数。
输出
输出一个整数,表示最多卖出的钱数。
样例输入
4000
6
2000
500
500
样例输出
1700

#include
using namespace std;
int main(){
	int mf,xj,t,hy,kkf,xjcake=0,kkcake=0,msum=0,sum=0;
	cin>>mf>>xj>>t>>hy>>kkf;
	for(int i=0;i<=xj/2;i++)
		for(int j=0;j<=kkf/75;j++){
			if((i*250+j*200)<=mf&&(i*75+j*150)<=t&&(i*100+j*150)<=hy&&i<=100&&j<=100){
				sum=i*400+j*450;
				if(sum>msum)
					msum=sum;				
			}
		}
	cout<<msum;
	return 0;
}

2.找和最接近但不超过K的两个元素

在一个长度为n(1 < n < 1000)的整数(0至1000之间)序列中,选出两个元素使得它们的和最接近但不超过K(0 <= K < 2000)。保证一定存在不超过K的两元素和。
时间限制:1000
内存限制:65536
输入
第一行输入一个整数n 第二行输入一个整数K 第三行输入序列,用空格分开
输出
最接近但不超过K的和
样例输入
4
7
1 2 2 8
样例输出
4

#include
using namespace std;
int main(){
	int n,k,sum,msum=0,a1,a2;
	int s[1002];
	cin>>n>>k;
	for(int i=0;i<n;i++)
		cin>>s[i];
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++){
			sum=s[i]+s[j];
			if(sum<k&&sum>msum)
				msum=sum;
		}
	cout<<msum;
	return 0;
}

3.数根

数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。 比如,对于24来说,把2和4相加得到6,由于6是一位数,因此6是24的数根。再比如39,把3和9加起来得到12,由于12不是一位数,因此还得把1和2加起来,最后得到3,这是一个一位数,因此3是39的数根。
时间限制:1000
内存限制:65536
输入
一个正整数(小于101000)。
输出
一个数字,即输入数字的数根。
样例输入
24
样例输出
6

#include
using namespace std;
int sg(int n){
	int sum=0;
	while(n){
		sum+=n%10;
		n/=10;
	}
	if(sum>=10)
		return sg(sum);
	return sum;
}
int main(){
	string s;
	int len,ans=0;
	cin>>s;
	len=s.size();
	for(int i=0;i<len;i++){
		ans=ans+s[i]-'0';
	}
	cout<<sg(ans);
	return 0;
}

4.迷信的病人

医院为了方便对患者进行建档和管理,引入了9位整数ID号来标识每个病人。最近医院入住了一个迷信的病人,他认为ID号的好坏直接决定了自己的命运。他对ID号x有如下要求:
(1)x的前三位数构成的整数是素数
(2)x的后三位数构成的整数是平方数(所谓平方数,是指它是某一个正整数的平方,e.g. 1,4,9,16…)
(3)x中不包含"13"
为了避免不必要的医患矛盾,医院须尽量满足他的需求。现给定正整数区间[m,n],请你判断存在几个满足病人需求的ID号。
时间限制:1000
内存限制:65536
输入
两个正整数m,n,以空格隔开。(999999999>=n>=m>=111111111)
输出
一个整数(满足要求的ID的个数)。
样例输入
157689476 157689687
样例输出
5
提示
存在5个满足要求的ID:157689484,157689529,157689576,157689625,157689676

#include
using namespace std;
bool su(int x){
	for(int i=2;i<x;i++){
		if(x%i==0)
			return false;
	}
	return true;
}
bool pf(int x){
	int n=sqrt(x);
	if(n*n==x)
		return true;
	return false;
}
int main(){
	int m,n,ans=0;
	cin>>m>>n;
	for(int i=m;i<=n;i++){
		int q,h;
		q=i/1000000;
		h=i%1000;
		int flag=0,k=i;
		while(k){
			if(k%10==3&&k/10%10==1)
				flag=1;
			k/=10;
		}
		if(flag==0&&su(q)&&pf(h))
			ans++;
	}
	cout<<ans;
	return 0;
}

5.算24

给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。 比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
时间限制:6000
内存限制:65536
输入
输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
输出
对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
样例输入
5 5 5 1
1 1 4 2
0 0 0 0
样例输出
YES
NO

#include
using namespace std;
//四则运算 
float f(float x,float y,int n){
	switch (n){
		case 1: return x+y;
		case 2: return x-y;
		case 3: return x*y;
		case 4: return 1.0*x/y;
	}
}
//((AOB)OC)OD
bool f1(float q,float w,float e,float r){
	float sum,sum1,sum2;
	for(int i=1;i<=4;i++){
		sum1=f(q,w,i);
		for(int j=1;j<=4;j++){
			sum2=f(sum1,e,j);
			for(int h=1;h<=4;h++){
				sum=f(sum2,r,h);	
				if(sum==24)	{
				//	printf("((%f%d%f)%d%f)%d%f\n",q,i,w,j,e,h,r);
					return true;					
				}	
	
			}
		}
	}
	return false;
}
//(AO(BOC)OD
bool f2(float q,float w,float e,float r){
	float sum,sum1,sum2;
	for(int i=1;i<=4;i++){
		sum1=f(w,e,i);
		for(int j=1;j<=4;j++){
			sum2=f(sum1,q,j);
			for(int h=1;h<=4;h++){
				sum=f(sum2,r,h);	
				if(sum==24)	{
				//	printf("%f%d(%f%d%f)%d%f\n",q,j,w,i,e,h,r);
					return true;					
				}	
	
			}
		}
	}
	return false;
}
//AO(BO(COD))
bool f3(float q,float w,float e,float r){
	float sum,sum1,sum2;
	for(int i=1;i<=4;i++){
		sum1=f(e,r,i);
		for(int j=1;j<=4;j++){
			sum2=f(w,sum1,j);
			for(int h=1;h<=4;h++){
				sum=f(q,sum2,h);
				//cout<
				//printf("%f%d(%f%d(%f%d%f))=%f\n",q,h,w,j,e,i,r,sum);				
				if(sum==24)		{
				//	printf("%f%d(%f%d(%f%d%f))\n",q,h,w,j,e,i,r);
					return true;					
				}
			}
		}
	}
	return false;
}
//AO((BOC)OD)
bool f4(float q,float w,float e,float r){
	float sum,sum1,sum2;
	for(int i=1;i<=4;i++){
		sum1=f(w,e,i);
		for(int j=1;j<=4;j++){
			sum2=f(sum1,r,j);
			for(int h=1;h<=4;h++){
				sum=f(sum2,q,h);	
				if(sum==24)	{
				//	printf("%f%d((%f%d%f)%d%f)\n",q,h,w,i,e,j,r);		
					return true;				
				}	
	
			}
		}
	}
	return false;
}
//(AOB)O(COD)
bool f5(float q,float w,float e,float r){
	float sum,sum1,sum2;
	for(int i=1;i<=4;i++){
		sum1=f(q,w,i);
		for(int j=1;j<=4;j++){
			sum2=f(e,r,j);
			for(int h=1;h<=4;h++){
				sum=f(sum1,sum2,h);	
				if(sum==24)	{
				//	printf("(%f%d%f)%d(%f%d%f))\n",q,i,w,h,e,j,r);	
					return true;						
				}	

			}
		}
	}
	return false;
}
int main(){
	float a[4];
	int ans=0;
	while(cin>>a[0]>>a[1]>>a[2]>>a[3]){
		ans=0;
		//终止条件 
		if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0)
			return 0;
		//四个数组合	
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				for(int k=0;k<4;k++)	
					for(int y=0;y<4;y++) {
						if(i!=j&&i!=k&&i!=y&&j!=k&&j!=y&&k!=y){
						//检验5种运算方式是否符合要求 
						if(f1(a[i],a[j],a[k],a[y]))  ans++;
						if(f2(a[i],a[j],a[k],a[y]))  ans++;
						if(f3(a[i],a[j],a[k],a[y]))  ans++;
						if(f4(a[i],a[j],a[k],a[y]))  ans++;
						if(f5(a[i],a[j],a[k],a[y]))  ans++;							
						}
				}
		if(ans!=0)	
			cout<<"YES"<<endl;
		else	
			cout<<"NO"<<endl;		 
	}
	return 0;		
}

大家有什么问题可以随时交流。

你可能感兴趣的:(c语言,算法,c++)