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

 

posted @ 2008-08-28 19:07  cnnbboy  阅读(542)  评论(0)    收藏  举报