Problem 2139 久违的月赛之二
Accept: 42 Submit: 106
Time Limit: 1000 mSec Memory Limit : 32768
KB
Problem Description
好久没举办月赛了,这次lqw又给大家出了5道题,因为hsy学长宣传的很到位,吸引了n个DDMM们来做,另一位kk学长说,全做对的要给金奖,做对4题要给银奖,做对3题要给铜奖。统计数据的时候,发现每题分别在n个人中有n1、n2、n3、n4、n5个人通过,lqw问kk:“这次难度稍微提高了些,你再猜下,至少会有多少个人获奖?”
Input
第一行一个数字t,表示有多少组数据,每组数据如下所示(100< t < 300, 10<=n<=100, n1,...,n5<=n):
n
n1 n2 n3 n4 n5
Output
针对每组数据,输出一个数,表示最低获奖人数。
Sample Input
2
92
76 72 72 53 92
81
70 81 45 63 64
Sample Output
64
58
关于1的在 http://www.cnblogs.com/tom987690183/p/3418944.html
1. “每题的通过人数一定大于等于最低获奖人数”,正式基于这个条件,
所以我们的可以把它的和加起来,平均分配各学生。
假如遇到这个例子(2,1,0,0,0),那至少有一个人能获得么?不可以。
2. 这就是2的问题需要考虑的,同理我只要考虑让1个人做错3道题,那么他就不能拿奖了呀。
数据范围比较小,所以可以贪心一下,每次人数+1,前三个大的错误数-1。(⊙o⊙)…,借别人的说.
请参考 http://hi.baidu.com/ydlqw/item/120cd21a5afd5becddeeca41?qq-pf-to=pcqq.c2c
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 8 int a[10]; 9 bool cmp(int n1,int n2) 10 { 11 return n1>n2; 12 } 13 int main() 14 { 15 int T,n; 16 int i,cur; 17 while(scanf("%d",&T)>0) 18 { 19 while(T--) 20 { 21 scanf("%d",&n); 22 for(i=1;i<=5;i++) 23 { 24 scanf("%d",&a[i]); 25 a[i]=n-a[i]; 26 } 27 sort(a+1,a+1+5,cmp); 28 cur=0; 29 while(a[3]!=0) 30 { 31 cur=cur+1; 32 if(cur==n)break;//这个你是要考虑的哦 测试数据 5 0 0 0 0 0 33 a[1]=a[1]-1; 34 a[2]=a[2]-1; 35 a[3]=a[3]-1; 36 sort(a+1,a+1+5,cmp); 37 } 38 printf("%d ",n-cur); 39 } 40 } 41 return 0; 42 }