POJ 3001 Gallup

問題

何人からアンケートを取って、
それぞれの項目の割合を、小数点k桁未満を四捨五入して算出した。


アンケートの元の人数としてありえるもののうち、最小のものを答えよ。
1以上9999以下に答えがない場合errorを出力せよ。

制約条件

小数点は最大5桁まで

方針

分母を固定する。
すると、割合の値から、その項目を答えた人数の最小値と最大値が求まる。
各項目の最小値と最大値の間に整数が1つ以上あり、
なおかつ最小値の合計と最大値の合計の間に分母があれば、それは求める分母である。

ソースコード

int n;
char in[20][20];

int main()
{
	int cs=0;
	while(scanf("%d",&n),n){
		int a[20];
		rep(i,n)scanf("%s",in[i]);
		int ten=1, i;
		for(i=strlen(in[0])-1;i>=0;i--){
			if(in[0][i]=='.')break;
			ten*=10;
		}
		if(i<0)ten=1;
		
		rep(i,n){
			double t;
			sscanf(in[i],"%lf",&t);
			a[i]=int(t*ten+0.5);
		}
		int total=100*ten, m=1;
		for(;m<=9999;m++){
			int MX=0,MN=0;
			bool ok=1;
			rep(i,n){
				int mn=(int)ceil(m*(a[i]-0.5)/100/ten-EPS);
				int mx=(int)(m*(a[i]+0.5)/100/ten-EPS);
				if(mn>mx)ok=0;
				MX+=mx; MN+=mn;
			}
			if(ok&&MN<=m&&m<=MX)break;
		}
		printf("Case %d: ",++cs);
		if(m>9999)puts("error");
		else printf("%d\n",m);
	}
	return 0;
}