http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2326/pid/4072

解题思路:
题目要求最短时间完成所有的考验,如果直接去求最短时间应该是不太现实的,因为这种思路既不符合贪心,又不能dp。仔细看不难发现,如果假设一个天数x,是可以通过从后往前贪心的方法去验证x天内是否可以完成所有的考验。
具体贪心方法是:假如x天之前都没有进行考验,那么对于第x天有x-1天的“空闲天”可以准备第x天的考验,于是从第x天向第0天判断每一天是不是有未完成考验,如果有就从空闲天中减去这个考验所需要的准备天数,依次维护空闲天数进行判断,最后判断一下是不是所有的考验都通过了即可。
但是如果从1到n枚举天数x是o(n^2)的复杂度,肯定是不行的,然后又发现假设天数y可以完成,那么天数大于y的都能完成,同样加入天数y不能完成,小于y的都不能完成,这就有了满足了二分判断所需要的性质,于是二分判断,复杂度满足题意。
代码:

#include <stdio.h>
#include <string.h>
const int Max = 1e6 + 100;
int vis[Max];
int data[Max], need[Max];
int isok(int n, int m){//判断n天是否可以完成m项考验int ans = n - 1, mem = 0, num = 0;memset(vis, 0, sizeof(vis));for (int a = n; a >= 0; a--){if (data[a] != 0 && !vis[data[a]] && ans >= need[data[a]]) {ans -= need[data[a]];mem += need[data[a]];vis[data[a]] = 1;if (++num == m)return 1;ans--;}else if (mem > 0)mem--;else ans--;if (ans <= 0)break;}return 0;
}
int main(){int T, n, m;scanf("%d", &T);while (T--){scanf("%d%d", &n, &m);for (int a = 1; a <= n; a++)scanf("%d", &data[a]);for (int a = 1; a <= m; a++)scanf("%d", &need[a]);int l = 1, r = n, ans = -1;while (l <= r){//二分判断int mid = (l + r) / 2;if (isok(mid, m)){ans = mid;r = mid - 1;}else{l = mid + 1;}}printf("%d\n", ans);}return 0;
}

第九届山东理工大学ACM网络编程擂台赛 F题题解相关推荐

  1. 第九届山东理工大学ACM网络编程擂台赛 热身赛 sdut4087 ldq's Sons

    题目链接 Time Limit: 1000MS Memory Limit: 65536KB Problem Description Xuanhuang: Wow, three cute boys. A ...

  2. 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4074博弈 - ldq的吃瓜比赛

    题目链接 ldq的吃瓜比赛 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description ldq 和 他的 ...

  3. 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4075GCD - ldq的黑心啤酒厂

    题目链接 ldq's brewery Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description LDQ ...

  4. F 阎小罗的Minimax (第十届山东理工大学ACM网络编程擂台赛 正式赛 )

    题解:by Mercury_Lc 阎小罗的矩阵给的n和m都不超过300,枚举一下所有情况就可以了,用前缀和来储存.数组a[x][y]代表前x行前y列的和是多少,那么枚举每一种切割的方式就可以.注意一下 ...

  5. 2018第九届蓝桥杯省赛c/c++ A 组题解(填空部分)

    第九届蓝桥杯省赛c/c++ A 组题解(部分) 1 分数 等比数列求前n项和 2 星期一 解题思路: 3 乘积尾零 4 第几个幸运数 5 打印图形 第九届蓝桥杯省赛c/c++ A 组题解(部分) 1 ...

  6. 2018第九届蓝桥杯JavaB组省赛真题及详解

    2018第九届蓝桥杯JavaB组省赛真题及详解 第一题:第几天 第二题:方格计数 第三题:复数幂 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 第九题:全 ...

  7. 2018年第九届蓝桥杯 JavaB组省赛 刷题思路及答案

    前言 本人是二本院校大二的计算机系学生,已经报名了下一届的蓝桥杯省赛,整个寒假学习了很多算法知识,我是看<算法很美>这个课程学习算法的,一套学习下来确实受益匪浅,视频在b站上面都有. 此前 ...

  8. 第九届蓝桥杯c/c++A组省赛题解

    分数 题目 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似:3 / 2 当然,这只是加了前2项而已 ...

  9. 山东理工大学ACM平台题答案关于C语言 2098 识别浮点常量问题

    识别浮点常量问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 编译器在对程序进行编译之前,首先要进行语法分析.通常,程序被分解 ...

  10. 安徽大学第九届大学生程序设计竞赛 网络预选赛

    A. 成功人士 Time Limit: 1000 ms   Memory Limit: 64 MB Total Submission: 250   Submission Accepted: 76 De ...

最新文章

  1. Emai乱码——解决的“迂回”战术
  2. Boosting for PRML
  3. Scrapy:python3下的第一次运行测试 1
  4. Ubuntu14-04安装redis和php5-redis扩展
  5. C# 发送电子邮件源码片段
  6. ctpn论文阅读与代码
  7. SpringCloud系列第09节之消息总线Bus
  8. xml建模包括以下_数据挖掘--建模与挖掘的结合
  9. 【Java后台】从零开始的Java后台开发(一)
  10. ppt插入计算机时间,WPS之PPT插入自动更新的时间设置
  11. Simulink模型的仿真
  12. 逆向破解flash视频url
  13. icem网格数和节点数_ansys中划分网格后,如何查看单元数和节点数
  14. 清爽的VS开发字体 -- Consolas
  15. java中复数_Java中的复数
  16. 1008 : 美元和人民币
  17. 自考02323《操作系统概论》第一章操作系统简介——思维导图
  18. 开发网页需要学什么?
  19. 使用Xshell远程连接CentOS7全过程,包括遇到的各种问题集合及解决方案
  20. CDA以API为数据源

热门文章

  1. 腾讯云服务器Lighthouse和CVM区别
  2. stm32用杜邦线与中断模拟led灯开关
  3. 服务器装系统bios设置方法,u盘重装系统bios设置步骤 bios设置U盘启动详解
  4. 引用腾讯地图时出现”鉴权失败,请传入正确的key“
  5. Django默认用户模型类和父类 AbstractUser 介绍
  6. scratch趣味编程——挖矿小游戏
  7. 基于Trie树实现拼音搜索自动补全
  8. Android使用DatePickerDialog日期控件使用主题android:Theme.Holo.Light.Dialog有白边的问题解决
  9. 通过银行卡号查询银行卡类型接口
  10. 如何在手机和电脑之间共享文件以及共享模拟器网络给电脑