POJ 3001 暴力

来源:互联网 发布:萧山网络问政进化镇 编辑:程序博客网 时间:2024/06/07 14:26

题意

某次调查有N个调查选项,已知每个调查选项的得票率(经过了四舍五入),问最少多少人参与了调查。

题解

这大概是这道题第一篇中文题解吧。。
暴力出奇迹,因为最多只有10000人参与投票,因此暴力尝试1至10000人即可。由于概率经过了四舍五入,因此还原的时候只能还原成一个区间,这个区间就是x-0.499到x+0.500(一定要注意精度问题,-0.49的精度不足以AC)。这样就可以计算出来是否可能有i个人参与了投票。如果尝试到10000人都是不可能参与投票,则输出-1。

注意事项

再次强调精度问题。。。

代码

#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<string>#include<set>#include<map>#define UP(i,l,h) for(int i=l;i<h;i++)#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)#define W(a) while(a)#define INF 0x3f3f3f3f#define LL long long#define MAXN 1010#define EPS 1e-10using namespace std;double percent[25];char ch[100];int bignum(int decimal){    int sum=1;    UP(i,0,decimal){        sum*=10;    }    return sum;}int main(){    int n;    int ks=1;    W(~scanf("%d",&n)){        if(n==0)            break;        UP(i,0,n){            scanf("%s",ch);            percent[i]=atof(ch);        }        int len=strlen(ch);        int decimal=0;        UP(i,0,len){            if(ch[i]=='.'){                decimal=len-i-1;                break;            }        }        int multinum=bignum(decimal);        int ans=INF;        UP(i,1,10000){            int mx=0,mi=0;            UP(j,0,n){                mi+=ceil(i*(percent[j]*multinum-0.500)/multinum/100);                mx+=floor(i*(percent[j]*multinum+0.499)/multinum/100);            }            if(i>=mi&&i<=mx){                ans=i;                break;            }        }        if(ans==INF)            printf("Case %d: error\n",ks++);        else            printf("Case %d: %d\n",ks++,ans);    }    return 0;}
原创粉丝点击