解いた問題のソースコードと解説など。


POJ 1666 Candy Sharing Game

問題文
生徒が車座に座り、各人に偶数個のキャンディが与えられる。先生の合図で、生徒は自分の持っているキャンディの半分を右にいる生徒に同時に渡す。その後キャンディが奇数個になった生徒にはキャンディが1つ追加される。この作業を全ての生徒のキャンディが同じ数になるまで行うとき、先生が合図する回数と終了時のキャンディの個数を求める。

ただのシミュレーション。同時に渡し合うので、左端からちょこちょこ渡す処理にすると間違い。

int candy[1000];
int tmp[1000];

int main(int argc, char **argv){
  int N;
  while(cin >> N, N){
    for(int i = 0; i < N; i++) cin >> candy[i];
    
    int blow = 0;
    while(count(candy, candy + N, candy[0]) != N){
      blow++;//blows
      
      //give candy
      for(int i = 0; i < N; i++) tmp[i] = (candy[i] / 2);
      for(int i = 0; i < N; i++){
	candy[(i + 1) % N] += tmp[i];
	candy[i] -= tmp[i];
      }

      //check odd
      for(int i = 0; i < N; i++)
	if(candy[i] % 2 == 1) candy[i]++;
    }
    cout << blow << " " << candy[0] << endl;
  }
  return 0;
}
Get up! 明日のSUPER ST@R!