码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces732D Exams

时间:2016-10-19 02:00:53      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 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 }

 

Codeforces732D Exams

标签:

原文地址:http://www.cnblogs.com/iRedBean/p/5975454.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!