蓝桥杯 真题 救济金发放、分糖果、刽子手游戏

题目

n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,A从1开始逆时针数,B从n开始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上)。接下来被官员选中的人(1个或者2个)离开队伍。

输入n,k,m输出每轮里被选中的人的编号(如果有两个人,先输出被A选中的)。例如,n=10,k=4,m=3,输出为4 8, 9 5, 3 1, 2 6, 10, 7。注意:输出的每个数应当恰好占3列。

输入:

10 4 3

输出:

_ _ 4_ _ 8,_ _ 9_ _ 5,_ _ 3_ _ 1,_ _ 2_ _ 6,_ 10,_ _ 7

#include <iostream> 
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include<ctype.h>
#define maxn 25
using namespace std;

//关键的问题就是确定移动的步长,并且在数组中循环,
//当遇到被换成0的元素就继续下一个。
//p=(p+d+n-1)%n+1;

int n,k,m,a[maxn];
int go(int p,int d,int t){
	while(t--){
		do{
		//核心代码:如果按正常的取余:(p+d)%n,想从1顺时针变成10是不可能的。这里的+n-1目的是防止变成0,防止对负数取余
			p=(p+d+n-1)%n+1;//
		}while(a[p]==0);//走到下一个非0数字 
	}
	return p;
}
int main(){
//int n,k,m,a[maxn];
scanf("%d%d%d",&n,&k,&m);
//while(scanf("%d%d%d",&n,&k,&m)==3&&n){
	for(int i=1;i<=n;i++) a[i]=i;
	int left=n;
	int p1=n,p2=1;
	while(left){
	
	p1=go(p1,1,k);
	p2=go(p2,-1,m);
	printf("%3d",p1);
	left--;
	if(p2!=p1){
		printf("%3d",p2);
		left--;
	}
	a[p1]=a[p2]=0;
	if(left!=0) printf(",");
}
   //  printf("\n");
//}
 return 0;
}

题目

有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
  每个小朋友都把自己的糖果分一半给左手边的孩子。
  一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
  反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
  你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。

格式要求

程序首先读入一个整数N(2<N<100),表示小朋友的人数。
  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
  要求程序输出一个整数,表示老师需要补发的糖果数。

例如:输入

3
  2 2 4

程序应该输出:

4

注意:

刚交换完,未补糖之前 糖果可能相等;
补糖之后 可能相等;

#include <iostream> 
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include<ctype.h>
#define maxn 100
using namespace std;
int main(){
 int n,a[106];
 long long s1=0,s2=0;
 cin>>n;
 for(int k=1;k<=n;k++){
  cin>>a[k]; s1+=a[k];
 }
while(1){
 int flag=0;
 for(int i=1;i<=n;i++){
 	int left=(i+n)%n+1;
 	a[i]=(a[i]+a[left])/2;
}//一轮交换糖果,老师还没有补糖
for(int k=1;k<=n;k++) {//看刚换完 未补糖果时是否相等
	if(a[kl]!=a[1]){
 	  	flag=2;break;
 	  }
}
  if(flag==0) break;//刚换完 未补糖果时已经相等,不用补 直接结束while
  else {//刚换完 未补糖果时  不相等 需要补
    	for(int kk=1;kk<=n;kk++){
    		if(a[kk]%2!=0) a[kk]++;//奇数糖 加1
    	      }
      for(int kll=1;kll<=n;kll++) {//看补完糖果之后 是否相等 
	  if(a[kll]!=a[1]){
 	  	flag=2;break;
 	      }
 	    } //for
 	if(flag==0) break; //补完糖果之后 相等,结束while
    }//else 
}//while
 for(int h=1;h<=n;h++) s2+=a[h];  	
cout<<(s2-s1);
return 0;
}

刽子手游戏

题目描述
游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母
则计算机会在一副“刽子手”画上填一笔,这幅画一共需要7笔就能完成,因此你最多只能错6次。注意猜一个已经猜过的字母也算错。
在本题中,你的任务是编写一个“裁判”程序,输入单词和玩家的猜测,判断玩家赢了,(You win.)、输了(You lose.)、还是放弃了(You chickened out.)
【输入】
会有好几组测试数据,每一组有3列。第一列为一个数字n,代表第几回合,第二列为这一回合的答案,第三列为这一回合玩家输入的猜测。如果n = -1代表输入结束。
1
cheese
chese
2
cheese
abcdefg
3
cheese
abcdefgij
-1
输出
Round 1
You win.
Round 2
You chickened out.
Round 3
You lose.

#include <iostream> 
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include<ctype.h>
#define maxn 100
using namespace std;
int left1, chance; //还需要猜left个位置,错chance次之后就会输 
char s[maxn], s2[maxn]; //答案是字符串s,玩家猜的字母序列是s2 
int win, lose; 	  //win=1表示已经赢了;lose=1表示已经输了 

void guess(char ch)
{
	int bad = 1;
	for (int i = 0; i < strlen(s); i++)
		if (s[i] == ch) { left1--; s[i] =' '; bad = 0; }
	if (bad) --chance;
	if (chance==0) lose = 1;
	if (left1==0) win = 1;
}

int main() { 

	int rnd;

while(scanf("%d%s%s",&rnd, s, s2) ==3 &&rnd != -1) 
{ 	
	printf("Round %d\n", rnd);
	win = lose = 0; //求解一组新数据之前要初始化 
	left1 = strlen(s); 
	chance = 7; 
	for(int i = 0; i < strlen(s2); i++) 
	{ 
		guess(s2[i]); //猜一个字母 
		if(win || lose) break; //检查状态 
	}//根据结果进行输出 
	if(win) printf("You win.\n"); 
	else if(lose) printf("You lose.\n"); 
	else printf("You chickened out.\n"); 
}
return 0; 
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值