B - Candy Sharing Game

题目是说,n个人坐一圈,开始每个人都有偶数个糖果,如果不相等,老师吹一次哨,每个人就把一半的糖果给右边的人,如果手里有奇数个糖果,老师会再给一个补成偶数,直到所有人糖果数相同。题目知,最后一定能达到相同状态。

Input
每次游戏输入N代表有N的学生,接下来N行代表N个学生分别持有的糖果数. 输入以0结束.
Output
每次游戏,输出老师吹哨的次数和每个人最后所得的糖果数
Sample Input
6 36 2 2 2 2 2
11 22 20 18 16 14 12 10 8 6 4 2
4 2 4 6 8
0
Sample Output
15 14
17 22
4 8

一个傻逼打的程序:

#include<stdio.h>
#include<string.h>
int n,p,i,tt,t,a[1001],b[1001];
int main(){
while(scanf("%d",&n)!=EOF&&n!=0){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
p=0;
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
while(1){
memset(b,0,sizeof(b));
p++;
for (i=1;i<=n-1;i++)
if (a[i]%21) b[i]++;
else {
b[i+1]=a[i]/2;
a[i]=a[i]/2;
}
if(a[n]%2
1) b[n]++;
else {
b[1]=a[n]/2;
a[n]=a[n]/2;
}
for (i=1;i<=n;i++)
a[i]+=b[i];

    t=a[1];
    tt=1;
  for (i=2;i<=n;i++)
    if (a[i]!=t) tt=0;
  if (tt==1) {
  printf("%d %d\n",p,t);
  break;

}
}
}
return 0;
}
//输入放错位置了,b数组清空放错位置了
然后题目没看清楚,先是分二分之一,等分完后,再看是不是奇数,在加一。

dalao:
#include
using namespace std;
int arr[100001];
bool judge(int n)
{
int i;
for(i=2;i<=n;++i)
if( arr[1]!=arr[i] )
return false;
return true;
}
int main()
{
int i,test,step;
while( cin>>test && test )
{
for(i=1;i<=test;++i)
cin>>arr[i];
step=0;
while( !judge(test) )
{
arr[0]=arr[test];
for(i=test;i>0;–i)
{
arr[i]=(arr[i-1]/2+arr[i]/2);
// 位运算判断奇偶,肯定比%2快
if( arr[i]&1 ) ++arr[i];
}
++step;
}
cout<<step<<" "<<arr[1]<<endl;
}
return 0;
}
//亮点:位运算
然后清晰一些,我用的是while(1),他用函数调用,感觉把我不会的用出来了。nice,兄die。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值