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. 题解-CSA Round#18 Randomly Permuted Costs

    Problem CSA Round 18 题意概要:给定一个有重边有自环 \(n\) 点 \(m\) 边的有向无环图(DAG),每条边有其权值,每当你走到一个点 \(x\) 时,所有从 \(x\) 连 ...

  2. Python之(scikit-learn)机器学习

    一.机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或 ...

  3. 【实战】SQL注入小脚本

    1.ORACLE布尔型盲注 import urllib import urllib2 import requests payloads = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ' ...

  4. Java面试题及答案解析

    面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...

  5. Activity之launchMode理解

    对于Activity中的四个lauchMode[standard(默认).singleTop.singleTask.singleInstance]的介绍网上已经有大把的文章了,但是在实际应用开发时,对 ...

  6. k8s的组件

    1.Master组件 1.API Server K8S对外的唯一接口,提供HTTP/HTTPS RESTful API,即kubernetes API.所有的请求都需要经过这个接口进行通信.主要负责接 ...

  7. Android --其他测试点

    全球化测试: 语言方向,参考:https://developer.android.google.cn/guide/topics/resources/pseudolocales. Spot locali ...

  8. 更新studio 3T的试用期时间

    j@echo off ECHO 重置Studio 3T的使用日期...... FOR /f "tokens=1,2,* " %%i IN ('reg query "HKE ...

  9. ping 原理与ICMP协议

    ping 的原理     ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接.ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机 ...

  10. vuex 全局store,前后端交互

    1.监听input输入框 titleHandler <div> <!-- 监听input输入框 titleHandler--> <input type="tex ...