zoj 1814 || poj 1666 Candy Sharing Game

好久木有做水题了。。。今天那个zoj2583看不懂,就找了个水题。。

 

这个题木有说N的范围,经过我多次测试,确定 N最大是100.。。

 

N个小朋友,交换糖果,顺时针坐,给自己右边的小朋友一半自己的糖果,如果交换一次后有奇数糖果的小朋友,老师可以给他一个凑成偶数。问你经过多少次交换最后所有小朋友糖果数都相同。

 

模拟。。不解释。注意,交换时是对这一轮初始态糖果进行交换。

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; int a[101]; int b[101]; int n; int findmax() { int m = 0; for(int i=0; i<n; i++) if( a[i] > m ) m = a[i]; return m; } int findmin() { int m = INT_MAX; for(int i=0; i<n; i++) if( a[i] < m ) m = a[i]; return m; } int main() { int ans1,ans2,count; while( ~scanf("%d",&n) && n ) { for(int i=0; i<n; i++) scanf("%d",&a[i]); count = 0; ans1 = findmax(); ans2 = findmin(); if( ans1 == ans2 ) { printf("0 %d/n",a[0]); continue; } while(1) { memcpy(b,a,sizeof(a)); for(int i=0; i<n; i++) { a[i] /= 2; if( i == n-1 ) { a[i] += b[0]/2; break; } a[i] += b[i+1]/2; } for(int i=0; i<n; i++) { if( a[i] % 2 == 1 ) a[i]++; } count++; ans1 = findmax(); ans2 = findmin(); if( ans1 == ans2 ) break; } printf("%d %d/n",count,a[0]); } return 0; }  

你可能感兴趣的:(测试)