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