题目链接:http://codeforces.com/problemset/problem/1185/C1
题目大意:
有n个学生排队依次进行考试(一次只能有一名同学进行考试,俺也不知道为啥,俺也不敢问),考试时间共计m,每个考生考试需要若干时间,考试时间结束后,没有时间考试的同学就不能考了。输入分两行,第一行为学生人数和考试时间,第二行输入每个考生考试需要多少时间。要去输出按照输入的考试时间来看,该同学如果想通过考试,他前面最少有几个同学不能参加考试(因为如果每个人都考的话,时间不够用)。题目保证数据正确(不会有某个学生通过考试的时间比考试总时间还长的情况)
思路:
分两种情况,一种是该同学和他之前的人都参加考试,也都能通过(时间足够),此时最少不参加考试人数为0;另一种情况即是考试时间不够用的时候了,此时,对数组排序(排序的人,应该是这位不能参与考试的同学前面的所有人,让他们中一部分人让出考试名额,让这位同学考试),优先让占用时间长的同学退出考试,直至遍历到的这位同学有足够时间通过考试,记录下有多少同学退出考试
具体代码:
1 #include <iostream> 2 #include <algorithm> 3 #include <stdlib.h> 4 #include <string> 5 #include <string.h> 6 #include <set> 7 #include <queue> 8 #include <math.h> 9 #include <stdbool.h> 10 11 #define LL long long 12 #define inf 0x3f3f3f3f 13 using namespace std; 14 const int MAXN=1000005; 15 16 17 int n,m; 18 int a[105],b[105],pre[105]; 19 20 int main() 21 { 22 #ifndef ONLINE_JUDGE 23 freopen("../in.txt","r",stdin); 24 #endif 25 scanf("%d%d",&n,&m); 26 for (int i=0;i<n;i++) 27 { 28 cin >> a[i]; 29 if (i!=0) 30 pre[i] = a[i]+pre[i-1]; 31 if (i==0) 32 pre[i] = a[i]; 33 } 34 for (int i=0;i<n;i++) 35 { 36 int sum = pre[i]; 37 b[i] = 0; 38 if (sum>m) 39 { 40 int people = 0; 41 sum -= a[i]; 42 sort(a,a+i); 43 for (int j=i-1;j>=0;j--) 44 { 45 sum -= a[j]; 46 people++; 47 if (sum+a[i]<=m) 48 break; 49 } 50 b[i] = people; 51 } 52 } 53 for (int i=0;i<n-1;i++) 54 printf("%d ",b[i]); 55 printf("%d ",b[n-1]); 56 return 0; 57 }