2012年第三届蓝桥杯省赛C语言B组

本文介绍了2012年第三届蓝桥杯省赛C语言B组的编程题目,包括微生物增殖、古堡算式、比酒量、奇怪的比赛、转方正、大数乘法、放棋子、密码发生器、夺冠概率和取球博弈等题目,每个题目都提供了题目描述、解题思路和代码实现。通过这些题目,读者可以提升C语言编程和算法应用能力。

2012年第三届蓝桥杯省赛C语言B组

题目来源:蓝桥杯
作者:GGG166

第一题
题目:微生物增殖

假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90 ?呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目
题目的结果令你震惊吗?这不是简单的数字游戏!真实的生物圈有着同样脆弱的性质!也许因为你消灭的那只 Y 就是最终导致 Y 种群灭绝的最后一根稻草!
请忍住悲伤,把答案写在“解答.txt”中,不要写在这里!

答案: 0 94371840
思路:
把时间翻倍用成int型,X出生后每隔3分钟分裂一次(数目加倍)变成6给0.5分钟,Y出生后每隔2分钟分裂一次(数目加倍)变成4给0.5分钟,x吃y为奇数的0.5分钟。
代码:

#include<iostream>
using namespace std;
int x,y,time=60;
int main()
{
   
   
	cin>>x>>y; 
	for(int i=1;i<=2*time;i++){
   
   // 时间 
		if(y<=0){
   
   //提前结束条件 
			y=0;
			break;
        } 
        if(i%2==1) y=y-x;//x吃y 
		if(i%6==0) x*=2;//x繁殖 
		if(i%4==0) y*=2;//y繁殖 
		
	}
	cout<<y<<endl;
	return 0;
}

第二题
题目:古堡算式

福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
答案写在“解答.txt”中,不要写在这里!

答案:21978
思路1:
从10000~100000搜索
代码:

#include<iostream>
using namespace std;
int main()
{
   
   
	int a[5];
	for(int i=10000;i<100000;i++){
   
   //列举ABCDE
		a[0]=i%10;
		a[1]=i/10%10;
		if(a[1]==a[0]) continue;
		a[2]=i/10/10%10;
		if(a[2]==a[1] || a[2]==a[0]) continue;
		a[3]=i/10/10/10%10;
		if(a[3]==a[2] || a[3]==a[1] || a[3]==a[0]) continue;
		a[4]=i/10/10/10/10%10;
		if(a[4]==a[3] || a[4]==a[2] || a[4]==a[1] || a[4]==a[0]) continue;
		for(int j=1;j<10;j++)// 列举?
		    if(i*j==(a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4]))
		        cout<<i<<endl;
	}
	return 0;
}

思路2:
用全排列,取前五个数
代码:


#include<isotream>
#include<algorithm>
using namespace std;
int arr[10] = {
   
   0,1,2,3,4,5,6,7,8,9};
int main(){
   
   
	do{
   
   
		//x1 x2 x3分别代表ABCDE 、? 和 EDCBA
		int x1=arr[0]*10000+arr[1]*1000+arr[2]*100+arr[3]*10+arr[4];
		int x2=arr[5];
		int x3=arr[0]+arr[1]*10+arr[2]*100+arr[3]*1000+arr[4]*10000;
		if(x1*x2==x3){
   
   
			cout<<x1<<endl;
		}
	}while(next_permutation(a,a+10));
	return 0;
}

第三题
题目:比酒量

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,
有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复…
直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当
第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:
“…昨天,我正好喝了一瓶…奉劝大家,开船不喝酒,喝酒别开船…”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,…
例如,有一种可能是:20,5,4,2,0
答案写在“解答.txt”中,不要写在这里!

答案:
12 6 4 2 0
15 10 3 2 0
18 9 3 2 0
20 5 4 2 0

思路:
用例举法,列出从每一轮可能的人数,在最后本人用的是double来判断,也可以用int来判断,用int时,要先同分,在就商和余数。
代码:

#include<iostream>
using namespace std;
int main()
{
   
   
	//i j x y 分别表示第1,2,3,4轮喝酒的人数 
	for(int i=1 ;i<=20 ;i++){
   
   
		for(int j=1 ;j<i ;j++){
   
   
			for(int x=1;x<j ;x++){
   
   
				for(int y=1 ;y<x ;y++){
   
   
					//注意double转型 否则1/i 1/j 1/x 1/y 都等于0 
					if(((double)1/i+(double)1/j+(double)1/x+(double)1/y)==1){
   
   
					    cout<<i<<" "<<j<<" "<<x<<" "<<y<<" "<<endl;
					}
				}
			}
		}
	}
	return 0; 
}

第四题
题目:奇怪的比赛
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。
答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
答案写在“解答.txt”中,不要写在这里

答案:
0010110011
0111010000
1011010000

思路:
不断的递归或深搜就可以了
代码:

#include<iostream>
using namespace std;
int ans[12];
//进行深度搜索,sum代表分数,i代表题目编号 
void dfs(int sum,int i){
   
   
	//递归出口,当该回答11题的时候(即已经答完10题) 
	if(i==11){
   
   
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值