题目
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;
}