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 }
时间: 2024-12-29 23:12:55

Codeforces732D Exams的相关文章

Exams(二分求左界+贪心)

用力戳我直达原题:D - Exams 题意: 有N天和M门课程. 接下来给你N天的行为,0表示这一天只能预习,[1,m]表示这一天可以考这门课(当然这一天你也可以选择不考或者预习). 接下来给你M个数cost[i],代表第i门课需要预习cost[i]天才能PASS. 求从第一天起算,最少需要几天才能PASS所有功课,如果N天都PASS不了,则输出-1. 做法: 1.先判断用N天能否PASS,不能就输出-1. 2.low = m, high = n.求左界. 3-1 judge的时候,一门课肯定越

Ural 1091 Tmutarakan Exams

Tmutarakan Exams Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Original ID: 109164-bit integer IO format: %lld      Java class name: (Any) University of New Tmutarakan trains the first-class specialists in mental arith

Codeforces Round #274 (Div. 2) C. Exams

Student Valera is an undergraduate student at the University. His end of term exams are approaching and he is to pass exactly n exams. Valera is a smart guy, so he will be able to pass any exam he takes on his first try. Besides, he can take several

2014 Super Training #3 H Tmutarakan Exams --容斥原理

原题: URAL 1091  http://acm.timus.ru/problem.aspx?space=1&num=1091 题意:要求找出K个不同的数字使他们有一个大于1的公约数,且所有的数字都不能大于一个指定的数字S. 解法:可以考虑每个S内的素数,此素数和它的所有倍数构成一个集合,则可以在这些集合中任意去k个元素,C(n,k)即为这种情况下的方法种数,比如K = 3,S = 10, 则可以形成3个集合: {2,4,6,8,10} , {3,6,9}, {5,10} ,第一个集合C(5,

1091. Tmutarakan Exams

1091. Tmutarakan Exams Time limit: 1.0 secondMemory limit: 64 MB University of New Tmutarakan trains the first-class specialists in mental arithmetic. To enter the University you should master arithmetic perfectly. One of the entrance exams at the Di

UVALive 6469 Deranged Exams (排列组合:绝逼是纯纯的高中知识啊)

题目意思是 : 给你一个n([1,17])表示有n个数据结构里的术语,然后n个对这些术语的定义,让你对这些术语和定义对号入座(相当于进行连线,A术语连A术语的定义).然后一个 k([0,n]),问你至少前k个术语定义对应错的总共有多少种. 起先我也不怎么会,忘完了,后来看别人的题解,可能我语文真的不怎么好,不是很能理解,然后问的别人...然后xxx给我说我有写个题解的必要了 so... 就是高中排列组合,至少前k个连错的方案总共有多少种,因为如果直接按照题意来,一般都很麻烦,所有就反正来,用[总

codeforce 732D . Exams

D . Exams 题意:一共有n天 m个考试 di表示第i天可以进行第m个考试 ai 表示第i个考试需要准备ai天才能通过考 问最少需要多少天才能通过所有考试 思路: 二分时间 每一次判断一下能否通过所有考试 得到最优解  每次二分到第x天时 从后面开始计算 尽量在后面的时间里考试 留更多的时间给前面的考试(比如第一次考试,如果可以在第5天和第7天考 如果第5天可以通过考试(即准备的时间大于等于ai),那么在第7天也一定可以通过,但是如果在第7天可以通过,在第5天不一定可以通过,所以一律选择时

URAL1091---Tmutarakan Exams(dp)

University of New Tmutarakan trains the first-class specialists in mental arithmetic. To enter the University you should master arithmetic perfectly. One of the entrance exams at the Divisibility Department is the following. Examinees are asked to fi

F - Tmutarakan Exams URAL - 1091 -莫比乌斯函数-容斥 or DP计数

F - Tmutarakan Exams 题意 : 从 < = S 的 数 中 选 出 K 个 不 同 的 数 并 且 gcd > 1 .求方案数. 思路 :记 录 一 下 每 个 数 的 倍 数 vector 存 储 ,最后从 2 开始 遍历 一遍每个数 ,从 他的倍数中 挑选 k个 组合数求解. 但是会有重复,因为 比如 K=2,S=15时 , 2倍数 : 2  ,4 , 6,  8, 10,  12, 14 ,   挑出了 这种情况 6 ,12,然后 从3的倍数 : 3, 6 ,9,12