您的位置:首页 > 其它

HDU 1034 Candy Sharing Game

2008-08-28 19:07 375 查看
简单模拟,题目大意是n个孩子围一圈,老师喊一声就每人把手中的糖果的一半分给自己右边的人,如果此时手中是奇数个的时候,就从老师那里要一颗变成偶数再除2。给定初始状态,每个孩子手上都有偶数个糖果,问老师喊几声,所有人手上都有一样多的糖果,个数是几个?

直接模拟。因为是同时给,所以如果用一个数组线性的往后传递,是错误的。开两个数组,一个传递前个数pre[],一个保存在传递后的个数now[],每一轮结束以后将传递前的个数更新。pre[i]=now[i],然后循环。

利用qsort排序来比较大小

#include <iostream>

#include <cstdlib>

using namespace std;

int now[101],pre[101],cnt;

int cmp(const void *a,const void *b)

{

return * (int *)a - *(int *)b;

}

int circe(int n)

{

int i;

cnt = 0;

while (1)

{

qsort(now,n,sizeof(now[0]),cmp);

if (now[0] == now[n-1])

break;

for (i = 0;i < n;i++)

{

now[(i+1)%n] = pre[(i+1)%n]/2+pre[i]/2;

if(now[(i+1)%n]%2!=0)

now[(i+1)%n]++;

}

for (i = 0;i < n;i++)

{

pre[i] = now[i];

}

cnt++;

}

return cnt;

}

int main()

{

int n,i,num;

while (cin >> n && n != 0)

{

for (i = 0;i < n;i++)

{

cin >> now[i];

pre[i] = now[i];

}

num = circe(n);

cout << num << " " << now[0] << endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: