Codeforces Round #377 (Div. 2) D. Exams

   题意:给你n个考试科目编号1~n以及他们所需要的复习时间ai;(复习时间不一定要连续的,可以分开,只要复习够ai天就行了)   然后再给你m天,每天有一个值di; 其中,di==0代表这一天没有考试(所以是只能拿来复习的); 若di不为0,则di的值就代表第i天可以考编号为di的科目 ;(当然这一天也可以不考而拿来复习) 。  问你最少能在第几天考完所有科目,无解则输出-1。

  

题解:首先,先想想最暴力的方法:从第1天到第n天这样一天天地试,每次判断前k天能否考完所有科目(至于怎么判断前k天能否够考完所有科目下面会说)。 这样子的最坏情况的复杂度是O(n^2);  那么如果不要这样一天天地判断过去的话,要进行优化;那么,由于题目要问最小天数能考完所有科目,且天数都是升序的—这时,就可以用二分了。 二分能考完所有科目的天数,每次判断该天数能否考完。   那么问题就被简化了;原来问题是最小的天数要考完所有科目,,而现在就只需关心怎么判断用前k天时间能考完所有科目    这里用贪心的方法:建立个变量sum复习需要用到的天数 , 用第k天开始往前扫;如果di不为0(另外还要有个标记数组来标记该科目是否是第一次扫到),则将该科目所需要的复习天数加到sum上; 如果di为0,则将sum-- (前提是sum不为0)。  扫完后,用标记数组判断是否所有科目都考了且sum是否为0 ; 若sum不为0,说明复习天数是不够用的。  最后复杂度是为O(nlogn)的。

( ps: 可能有的人会觉得从后往前扫,只有遇到的科目第一次出现时才加入到sum中,但这些都是k天内各科目的最后"期限",虽然判断到用k天可行,但可能不是最优的(一开始自己就在这上面给坑了=_=)。    但是,因为上面已经有二分了,所以我们这后面只要关注在能不能用k天将所有科目考完,而不用理会它是不是最优的! )

 下面是AC代码:  这一题的后台数据其实是有点水的,,如果发现代码有Bug的话欢迎各位提出  (o゜▽゜)o☆

 /**
* @author geek1116
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <map>
#include <set>
const int inf=0x3f3f3f3f;
const double PI=acos(-1.0);
const double EPS=1e-;
const int MAXN=1e5;
using namespace std;
typedef long long ll;
typedef pair<int,int> P; int n,m;
int d[MAXN+];
int a[MAXN+];
int book[MAXN+]; //标记数组 bool judge(int x) //判断用前x天是否可行
{
memset(book,,sizeof(book));
int sum=,cnt=;
//
for(int i=x;i>=;i--)
{
if(d[i])
{
if(!book[d[i]]) sum+=a[d[i]],book[d[i]]=,cnt++;
else if(sum!=) sum--;
}
else if(sum!=)
sum--;
}
//
if(sum||cnt!=m) return false;
else return true;
}
int main()
{
//freopen("input.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&d[i]);
for(int i=;i<=m;i++) scanf("%d",&a[i]);
//
int l=,r=n,mid;
while(l<r) //二分结束天数
{
mid=(l+r)>>;
if(judge(mid)) r=mid;
else l=mid+;
}
//
if(judge(l)) printf("%d\n",l);
else if(judge(r)) printf("%d\n",r);
else printf("%d\n",-);
return ;
}

Codeforces Round #377 (Div. 2) D. Exams的更多相关文章

  1. 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 ...

  2. 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 ...

  3. Codeforces Round #377 (Div. 2) D. Exams 贪心 + 简单模拟

    http://codeforces.com/contest/732/problem/D 这题我发现很多人用二分答案,但是是不用的. 我们统计一个数值all表示要准备考试的所有日子和.+m(这些时间用来 ...

  4. Codeforces Round #274 (Div. 1) A. Exams 贪心

    A. Exams Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/480/problem/A Des ...

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

    http://codeforces.com/contest/479/problem/C C. Exams time limit per test 1 second memory limit per t ...

  6. Codeforces Round #377 (Div. 2)

    #include <iostream> #include <stdio.h> #include <string.h> using namespace std; in ...

  7. Codeforces Round #377 (Div. 2)D(二分)

    题目链接:http://codeforces.com/contest/732/problem/D 题意: 在m天中要考k个课程, 数组a中有m个元素,表示第a[i]表示第i天可以进行哪门考试,若a[i ...

  8. 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 ...

  9. Codeforces Round #377 (Div. 2) E. Sockets

    http://codeforces.com/contest/732/problem/E 题目说得很清楚,每个电脑去插一个插座,然后要刚好的,电脑的power和sockets的值相同才行. 如果不同,还 ...

随机推荐

  1. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  2. springboot配置过滤器和拦截器

    import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Http ...

  3. APP加固反调试(Anti-debugging)技术点汇总

    0x00 时间相关反调试 通过计算某部分代码的执行时间差来判断是否被调试,在Linux内核下可以通过time.gettimeofday,或者直接通过sys call来获取当前时间.另外,还可以通过自定 ...

  4. javascript事件绑定1-模拟jquery可爱的东西

    1.给对象添加事件attachEvent(兼容IE,不兼容ff.chrome) <html xmlns="http://www.w3.org/1999/xhtml"> ...

  5. 使用 CSS 追踪用户

    原文地址:Crooked Style Sheets 作者:jbtronics 除了使用 JS 追踪用户,现在有人提出了还可以使用 CSS 进行网页追踪和分析,译者认为,这种方式更为 优雅,更为 简洁, ...

  6. html与css命名规范小结

    一.命名规则说明 所有的命名最好都用小写 使用英文命名 给每一个表格和表单加上一个唯一的.结构标记id 给每个图片加上alt标签,优点在于图片发生错误时,alt可以体现给用户 二.相对网页外层重要部分 ...

  7. 浅谈ByteBuffer转换成byte[]时遇到的问题

    有些时候我们要把ByteBuffer转换成byte[]来使用.于是很多时候会用以下代码来转换: ByteBuffer buf; .....(一些往buffer写数据的操作) byte[] bs= ne ...

  8. 【Linux】Ubuntu输入法不能开机自启的解决方法

    操作系统:Ubuntu Kylin 16.10 自从操作系统安装了搜狗输入法以后,每次重启电脑都需要手动启动Fcitx,才能启动搜狗输入法.下面给大家介绍输入法开机自启的解决方法: 操作系统的用户家目 ...

  9. 本博客基本不再更新,请移步至我的CSDN博客

    本博客基本不再更新,请移步至我的CSDN博客:http://blog.csdn.net/wpxu08

  10. jQuery插件的怎么写

    对于jQuery之前一直用,也看到过别人写的插件,直到最近才想着学习怎么写自己的jQuery插件,今天看了网上的一些资料,发现其实很简单的. 先看一个简单的jQuery插件的例子 <script ...