Codeforces Round #377 (Div. 2)D(二分)
题目链接:http://codeforces.com/contest/732/problem/D
题意:
在m天中要考k个课程,
数组a中有m个元素,表示第a[i]表示第i天可以进行哪门考试,若a[i]为0,则表示当天不能参加任何科目的考试,只能预习或者休息;
数组b中有k个元素,b[i]表示科目i需要复习几天才能通过;
问最快需要几天能通过所有考试,如果不能完成所有科目考试,输出-1;
思路:
用二分方法直接找满足条件的最小的数,其中数是指当前天是第几天,条件是指当前天以前是否能考完所有科目(包括当前天);
代码:
#include <bits/stdc++.h>
#define MAXN 100000+10
using namespace std; int a[MAXN], b[MAXN], n, k; int gg(int x){ //××××××判断花费x天能否完成所有科目考试,即能否在第x天以前完成所有科目考试;
int cnt=, vis[MAXN];
memset(vis, , sizeof(vis));
for(int i=x; i>=; i--){
// cout << cnt << "//" << endl;
if(!a[i]){
cnt--;
cnt=max(cnt, );
}else if(!vis[a[i]]){
cnt+=b[a[i]-];
// cout << cnt << "***" << endl;
vis[a[i]]=;
if(cnt>i){
return ;
}
}else if(vis[a[i]]){
cnt--;
cnt=max(, cnt);
}
}
for(int i=; i<=k; i++){
if(!vis[i]){
return ;
}
}
return ;
} int main(void){
ios::sync_with_stdio(false), cin.tie(), cout.tie();
cin >> n >> k;
for(int i=; i<n; i++){
cin >> a[i];
}
for(int i=; i<k; i++){
cin >> b[i];
}
int l=, r=n;
while(l<r){ //××××××二分查找满足条件的最小数
int mid=(l+r)>>;
// cout << mid << " " << gg(mid) << endl;//****
if(gg(mid)){
r=mid;
}else{
l=mid+;
}
}
if(l>=n){
cout << "-1" << endl;
}else{
cout << l+ << endl;
}
return ;
}
Codeforces Round #377 (Div. 2)D(二分)的更多相关文章
- Codeforces Round #377 (Div. 2) D. Exams
Codeforces Round #377 (Div. 2) D. Exams 题意:给你n个考试科目编号1~n以及他们所需要的复习时间ai;(复习时间不一定要连续的,可以分开,只要复习够ai天 ...
- Codeforces Round #404 (Div. 2) C 二分查找
Codeforces Round #404 (Div. 2) 题意:对于 n and m (1 ≤ n, m ≤ 10^18) 找到 1) [n<= m] cout<<n; 2) ...
- Codeforces Round #377 (Div. 2)A,B,C,D【二分】
PS:这一场真的是上分场,只要手速快就行.然而在自己做的时候不用翻译软件,看题非常吃力非常慢,还有给队友讲D题如何判断的时候又犯了一个毛病,一定要心平气和,比赛也要保证,不要用翻译软件做题: Code ...
- Codeforces Round #377 (Div. 2) D. Exams(二分答案)
D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...
- Codeforces Round #377 (Div. 2) D. Exams 二分
D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- Codeforces Round #377 (Div. 2) A B C D 水/贪心/贪心/二分
A. Buy a Shovel time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Codeforces Round #324 (Div. 2) C (二分)
题目链接:http://codeforces.com/contest/734/problem/C 题意: 玩一个游戏,一开始升一级需要t秒时间,现在有a, b两种魔法,两种魔法分别有m1, m2种效果 ...
- Codeforces Round #377 (Div. 2) E. Sockets
http://codeforces.com/contest/732/problem/E 题目说得很清楚,每个电脑去插一个插座,然后要刚好的,电脑的power和sockets的值相同才行. 如果不同,还 ...
- Codeforces Round #377 (Div. 2) D. Exams 贪心 + 简单模拟
http://codeforces.com/contest/732/problem/D 这题我发现很多人用二分答案,但是是不用的. 我们统计一个数值all表示要准备考试的所有日子和.+m(这些时间用来 ...
随机推荐
- .NET Core Preview
.NET Core Preview 这是很容易上手使用.NET Core在您选择的平台上. 你只需要一个命令行,一个文本编辑器和10分钟的时间. 原文链接:https://www.microsoft. ...
- Joda-time是java处理时间非常棒的jar
http://www.joda.org/joda-time/ maven: <dependency> <groupId>joda-time</groupId> &l ...
- Effective Java 学习笔记之创建和销毁对象
一.考虑用静态工厂方法代替构造器 1.此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法. 2.静态工厂方法的优势有: a.使用不同的方法名称可显著地表明两个静态工厂方法 ...
- 剑指Offer 跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路: f(n)=f(n-1)+f(n-2); f(1)=1,f(2)=2; AC代码 ...
- Android列表控件ListView详解
ListView绝对可以称得上是Android中最常用的控件之一,几乎所有应用程序都会用到它. 由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候 ...
- Raspberry Pi 配置笔记二
配置源 http://blog.chinaunix.net/uid-21658993-id-4702322.html deb http://ipv4.mirrors.ustc.edu.cn/raspb ...
- 18.1---不用加号的加法(CC150)
1,自己写的又长又臭的代码,也能AC,但是太丑了.主要是通过二进制来算. public static int addAB(int a, int b){ int res = 0; String str1 ...
- Tomcat端口占用
Tomcat端口占用问题 1.打开cmd,运行 netstat -aon!findstr "8080"查看该端口中运行的服务: 2.运行taskkill /pid PID /F 强 ...
- 使用GitHub
1. 进入 1.1 建立账号 打开网站https://github.com/主页上就可以注册.注册之后会有一个简单的帮助文档,在帮组文档上可以下载一个PC客户端(如果是WINDOWS平台,需要.NET ...
- nova 虚拟机迁移
ref: 官方文档很给力: nova 迁移有以下类型: Non-live migration (sometimes referred to simply as ‘migration’). The in ...