HDU 1034 Candy Sharing Game
简单模拟,题目大意是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;
}

浙公网安备 33010602011771号