Codeforces732D Exams

显然要二分答案,然后对于一个天数,我们来判断是否可以通过所有考试,这里就贪心来安排就好了。

首先我们希望每门课的考试时间越晚越好,然后就是先复习最早开始的考试。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 vector<int> pos[100010];
 5 int d[100010];
 6 int a[100010];
 7 int n, m;
 8 
 9 bool judge(int mid)
10 {
11     vector<pair<int, int>> course;
12     for (int i = 1; i <= m; i++)
13     {
14         vector<int>::iterator it = upper_bound(pos[i].begin(), pos[i].end(), mid);
15         if (it == pos[i].begin())
16             return false;
17         it--;
18         course.push_back({*it, i});
19     }
20     sort(course.begin(), course.end());
21     int used = 0;
22     for (auto &c : course)
23     {
24         if (c.first - 1 - used < a[c.second])
25             return false;
26         used += a[c.second] + 1;
27     }
28     return true;
29 }
30 
31 int main()
32 {
33     scanf("%d%d", &n, &m);
34     for (int i = 1; i <= n; i++)
35     {
36         scanf("%d", d + i);
37         if (d[i] > 0)
38             pos[d[i]].push_back(i);
39     }
40     for (int i = 1; i <= m; i++)
41         scanf("%d", a + i);
42     int l = 1, r = n;
43     if (!judge(n))
44         puts("-1");
45     else
46     {
47         while (l < r)
48         {
49             int mid = l + r >> 1;
50             if (judge(mid))
51                 r = mid;
52             else
53                 l = mid + 1;
54         }
55         printf("%d", l);
56     }
57     return 0;
58 }

 

posted @ 2016-10-18 22:58  iRedBean  阅读(378)  评论(0编辑  收藏  举报