Exam in BerSU (easy version) (模拟)

题目链接: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\n",b[n-1]);
56     return 0;
57 }

猜你喜欢

转载自www.cnblogs.com/-Ackerman/p/11221062.html
今日推荐