sgu152:Making round

来源:互联网 发布:淘宝店铺打折工具 编辑:程序博客网 时间:2024/05/16 14:56
题意:
给几个数,算出每个数所占数的总和的百分比,所有的百分比加起来要等于100,取整的时候可以向上取整或向下。
分析:
设sum=∑a[i],sum=0输出无解;
对于每个a[i]:
①如果100*a[i]%sum==0,那么p[i]=100*a[i]/sum且不能再更改;
②如果100*a[i]%sum!=0,那么p[i]=100*a[i]/sum,等待后续更改;
记录sum2=∑p[i],如果sum2<100,那么对于前100-sum2个可以更改的p[i]++,输出答案即可。
#include <cstdio> #include <cstring>using namespace std;const int MAXN = 10005, INF = 1e9;int n = 0, a[MAXN] = {0};int p[MAXN] = {0}, sum = 0, sum2 = 0;bool able[MAXN] = {0};int main(){scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%d", a+i);sum += a[i];}if(sum == 0){puts("No solution");return 0;}memset(able, true, sizeof(able));for(int i = 1; i <= n; ++i){if(100*a[i]%sum == 0) able[i] = false;p[i] = 100*a[i]/sum;sum2 += p[i];}sum2 = 100-sum2;for(int i = 1; i <= n && sum2; ++i)if(able[i]) p[i]++, sum2--;if(sum2){puts("No solution");return 0;}for(int i = 1; i <= n; ++i)printf("%d ", p[i]);return 0;}

0 0