4095: love168yk的选美大赛
Total Submit: 51 Accepted:7
Description
话说最近love168yk参加了数信学院的选美大赛,跟他同台参加的还有N-1位MM,love168yk自知没有多大希望赢得比赛,但是他又不想这么早就被淘汰(分数最低就被淘汰),只要每个人的分数一样他就熬过第一轮预选赛了,分数是由两部分组成的,一部分是裁判给的分数,另一部分是观众给的,每个人一开始都有裁判给的分Ji,分数层次不齐,接着观众投票阶段就看观众对于选手的支持率Yi了,观众的支持率按百分比来算,且每个观众最多给一位选手投票,也就是说总的支持率加起来刚好是1,总分是选手得到的裁判分+观众支持率*总裁判分(N个人得到的裁判分总和X)即Ji+Yi*X,分数最低的就淘汰了,现在让你写一个程序来,让你计算出每个选手应得到多少的支持率,满足不能出现单个最低分数,应为出现了单个最低就将被淘汰,且要满足每个人得到的支持率最小,且不可能出现裁判总分为0的情况!!!
Input
测试数据有多组,第一行T表示有T组数据,接下来T行,每行的第一个数字N表示有多少参赛选手,后面跟着N个数据Ji都用空格隔开。2<N<200, 0>=Ji<=100.
Output
每组测试数据每行输出"Case #x: ",接着N个数据分别表示每位选手应得得支持率mi,x从1开始,mi保留两位小数。
Sample Input
4
2 20 10
2 10 0
4 25 25 25 25
3 24 30 21
Sample Output
Case #1: 33.33 66.67
Case #2: 0.00 100.00
Case #3: 25.00 25.00 25.00 25.00
Case #4: 34.67 26.67 38.67
这个题还是比较好的,早上写了一下wa,下午搬完书回来就在想
最早的贪心过程就是按照权值其实和求全部数的平均数思想一样,不过是绕了个弯
提交一发wa,然后发现可能有输出负数的操作,又交了几发
最后我的贪心过程是选小的数看它们最多能加到多少,然后求下平均数,大数均输出0.00就好
其实这个题就限制了只能用类似的贪心过程,下面的数相加可能大于100也可能小于100的
#include <stdio.h> #include <algorithm> using namespace std; int a[205],b[205]; int main() { int T; while(~scanf("%d",&T)) { int k=1; while(T--) { int n,s1=0; scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); b[i]=a[i]; s1+=a[i]; } sort(b+1,b+n+1); int f=n,s=b[1]; for(int i=2; i<=n; i++) { s+=b[i]; if(s+s1<i*b[i]) { f=i-1; s-=b[i]; break; } } s+=s1; printf("Case #%d:",k++); for(int i=1; i<=n; i++) if(a[i]>b[f]) printf(" 0.00"); else printf(" %.2f",(s*1./f-a[i])*100/s1); putchar(10); } } return 0; }