CodeForces732D——Exams 详解

  • Exam
  • 题目描述(google翻译)

    • Vasiliy的考试期限将持续n天。他必须通过m门科目的考试。受试者编号为1至m。

      大约每天我们都知道当天可以通过m个科目中的哪一个的考试。也许,有一天你不能通过任何考试。任何一天都不允许通过多个考试。

      每天Vasiliy都可以通过当天的考试(需要一整天)或准备一整天的考试或休息。

      关于每个主题Vasiliy知道一个数字ai - 他准备通过考试号码的天数i。 Vasiliy可以在准备考试时切换科目,没有必要在考试编号i的ai天内连续准备。他可以以任何方式混合考试准备。

      您的任务是确定Vasiliy可以通过所有考试的最短天数,或确定不可能。每次考试都应该通过一次。

  • 输入

    • 第一行包含两个整数n和m(1≤n,m≤105) - 考试期间的天数和科目数。

      第二行包含n个整数d1,d2,…,dn(0≤di≤m),其中di是考试的科目号,如果是 3,就代表可以考第三门。如果di等于0,则不允许在第i天通过任何考试。

      第三行包含m个正整数a1,a2,…,am(1≤ai≤105),其中ai是在通过对象i的考试之前准备所需的天数。

  • 输出
    • 打印一个整数 - Vasiliy可以通过所有考试的最小天数。如果不可能,请打印-1。
  • 样例输入 1
    • 7 2
      0 1 0 2 1 0 2
      2 1
  • 样例输出 1
    • 5
  • 样例输入 2
    • 10 3
      0 0 1 2 3 0 2 0 1 2
      1 1 4
  • 样例输出 2
    • 9
  • 样例输入 3
    • 5 1
      1 1 1 1 1
      5
  • 样例输出 3
    • -1
  • 问题分析
    • 贪心的想,也就是考试往后推,直到最后能考的那一天,如果这样复习时间都不够,那么肯定是过不了的。
    • 那么二分怎么用呢,二分就用在时间上,对于一个输入天数 n,他最迟不能超过 n 天通过考试,否则就不能通过,因此利用二分时间找出答案。
    • 你可能会产生这样的疑问,怎么保证程序在某一门考试的最后期限来临之前将该科目可以利用的时间都用上。这个并不难实现,只需要将每个科目的位置记录下来,比如对于第二组数据,1 首先出现,那么它的位置为 3,记为1 - 3,接下来是 2 - 4,3 - 5,2 - 7,1 - 9,2 - 10,看到了吗,只要 1 后面还有 1,它的位置就会被修改,那我们只需要根据记录的位置信息来判断接下来要考试的科目和所拥有的时间,就可以保证在考试前利用所有可用的时间。
#include <iostream>
#include <cstdio>
#include <cstring> #define Maxn 100001 using namespace std; int day[Maxn],exam[Maxn];
int n,m;
bool deal(int mid); int main()
{ cin>>n>>m;
int i = ;
for(i = ; i <= n; i++)
cin>>day[i];
for(i = ; i <= m; i++)
cin>>exam[i];
int l = ;
int r = n;
int ans = -;
while(r >= l)
{
int mid = (l + r)/;
if(deal(mid))
{
ans = mid;
r = mid - ;
}
else
l = mid + ;
}
cout<<ans;
return ;
} bool deal(int mid)
{
int havetime = ;
int lastday[Maxn];
memset(lastday,-,sizeof(lastday));
int i = ;
for(i = ; i <= mid; i++)
{
if(day[i] != )
{
lastday[day[i]] = i;
}
}
for(i = ; i <= m ; i++)
{
if(lastday[i] == -)
return false;
}
for(i = ; i <= mid; i++)
{
if(day[i] == )
havetime++;
else
{
if(lastday[day[i]] == i)
{
if(havetime >= exam[day[i]])
{
havetime -= exam[day[i]];
}
else
return false;
}
else
havetime++;
}
}
return true;
}

二分算法题目训练(二)——Exams详解的更多相关文章

  1. 二分算法题目训练(一)——Shell Pyramid详解

    HDU2446——Shell Pyramid 详解 Shell Pyramid 题目描述(Google 翻译的) 在17世纪,由于雷鸣般的喧嚣,浓烟和炽热的火焰,海上的战斗与现代战争一样.但那时,大炮 ...

  2. 二分算法题目训练(三)——Anton and Making Potions详解

    codeforces734C——Anton and Making Potions详解 Anton and Making Potions 题目描述(google翻译) 安东正在玩一个非常有趣的电脑游戏, ...

  3. 二分算法题目训练(四)——Robin Hood详解

    codeforces672D——Robin Hood详解 Robin Hood 问题描述(google翻译) 我们都知道罗宾汉令人印象深刻的故事.罗宾汉利用他的射箭技巧和他的智慧从富人那里偷钱,然后把 ...

  4. 【模型推理】量化实现分享二:详解 KL 对称量化算法实现

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下 K ...

  5. ViewPager 详解(二)---详解四大函数

    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...

  6. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

  7. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  8. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  9. Hexo系列(二) 配置文件详解

    Hexo 是一款优秀的博客框架,在使用 Hexo 搭建一个属于自己的博客网站后,我们还需要对其进行配置,使得 Hexo 更能满足自己的需求 这里所说的配置文件,是位于站点根目录下的 _config.y ...

随机推荐

  1. WxWidgets与其他工具包的比较(15种方案)

    一些一般注意事项: wxWidgets不仅适用于C ++,而且具有python,perl,php,java,lua,lisp,erlang,eiffel,C#(.NET),BASIC,ruby甚至ja ...

  2. 设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)

    登录 保存密码 安全 加密 最近发现群内大伙对用Hbuilder做的APP怎么做登录功能以及维护登录状态非常困惑,而我前一段时间正好稍微研究了一下,所以把我知道的告诉大家,节约大家查找资料的时间. 你 ...

  3. VBA While Wend循环

    在While...Wend循环中,如果条件为True,则会执行所有语句,直到遇到Wend关键字. 如果条件为false,则退出循环,然后控件跳转到Wend关键字后面的下一个语句. 语法 以下是VBA中 ...

  4. shim和polyfill 区别解释

    polyfill 是 shim 的一种.shim 是将不同 api 封装成一种,比如 jQuery 的 $.ajax 封装了 XMLHttpRequest 和 IE 用 ActiveXObject 方 ...

  5. 快速提交一个项目到github或gitee上

    以下步骤假设你已经安装好git 一.Git 全局设置: git config --global user.name "用户名" git config --global user.e ...

  6. vue 做的tabBar组件

    效果如下 调用 <tabbar :selected='selected'></tabbar> 组件 <template> <div class='tabbar ...

  7. python OpenCV使用

    关于OpenCV简介  OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C ...

  8. Alpha版本第二周小结

               软工作业---Alpha版本第二周小结   姓名 学号 周前计划 每周实际工作记录 自我打分 yrz 1417 协助原型设计的完善,督促组员完成个人任务 原型优化设计未完成,但体 ...

  9. C#中流Stream的使用-学习

    概念 提供字节序列的一般视图.这是一个抽象类. 子类: Derived Microsoft.JScript.COMCharStream System.Data.OracleClient.OracleB ...

  10. Go 逃逸分析

    Go 逃逸分析 堆和栈 要理解什么是逃逸分析会涉及堆和栈的一些基本知识,如果忘记的同学我们可以简单的回顾一下: 堆(Heap):一般来讲是人为手动进行管理,手动申请.分配.释放.堆适合不可预知大小的内 ...