第九届山东理工大学ACM网络编程擂台赛 F题题解
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题题解相关推荐
- 第九届山东理工大学ACM网络编程擂台赛 热身赛 sdut4087 ldq's Sons
题目链接 Time Limit: 1000MS Memory Limit: 65536KB Problem Description Xuanhuang: Wow, three cute boys. A ...
- 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4074博弈 - ldq的吃瓜比赛
题目链接 ldq的吃瓜比赛 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description ldq 和 他的 ...
- 第九届山东理工大学ACM网络编程擂台赛 正式赛 sdut4075GCD - ldq的黑心啤酒厂
题目链接 ldq's brewery Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description LDQ ...
- F 阎小罗的Minimax (第十届山东理工大学ACM网络编程擂台赛 正式赛 )
题解:by Mercury_Lc 阎小罗的矩阵给的n和m都不超过300,枚举一下所有情况就可以了,用前缀和来储存.数组a[x][y]代表前x行前y列的和是多少,那么枚举每一种切割的方式就可以.注意一下 ...
- 2018第九届蓝桥杯省赛c/c++ A 组题解(填空部分)
第九届蓝桥杯省赛c/c++ A 组题解(部分) 1 分数 等比数列求前n项和 2 星期一 解题思路: 3 乘积尾零 4 第几个幸运数 5 打印图形 第九届蓝桥杯省赛c/c++ A 组题解(部分) 1 ...
- 2018第九届蓝桥杯JavaB组省赛真题及详解
2018第九届蓝桥杯JavaB组省赛真题及详解 第一题:第几天 第二题:方格计数 第三题:复数幂 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 第九题:全 ...
- 2018年第九届蓝桥杯 JavaB组省赛 刷题思路及答案
前言 本人是二本院校大二的计算机系学生,已经报名了下一届的蓝桥杯省赛,整个寒假学习了很多算法知识,我是看<算法很美>这个课程学习算法的,一套学习下来确实受益匪浅,视频在b站上面都有. 此前 ...
- 第九届蓝桥杯c/c++A组省赛题解
分数 题目 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似:3 / 2 当然,这只是加了前2项而已 ...
- 山东理工大学ACM平台题答案关于C语言 2098 识别浮点常量问题
识别浮点常量问题 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 编译器在对程序进行编译之前,首先要进行语法分析.通常,程序被分解 ...
- 安徽大学第九届大学生程序设计竞赛 网络预选赛
A. 成功人士 Time Limit: 1000 ms Memory Limit: 64 MB Total Submission: 250 Submission Accepted: 76 De ...
最新文章
- Emai乱码——解决的“迂回”战术
- Boosting for PRML
- Scrapy:python3下的第一次运行测试 1
- Ubuntu14-04安装redis和php5-redis扩展
- C# 发送电子邮件源码片段
- ctpn论文阅读与代码
- SpringCloud系列第09节之消息总线Bus
- xml建模包括以下_数据挖掘--建模与挖掘的结合
- 【Java后台】从零开始的Java后台开发(一)
- ppt插入计算机时间,WPS之PPT插入自动更新的时间设置
- Simulink模型的仿真
- 逆向破解flash视频url
- icem网格数和节点数_ansys中划分网格后,如何查看单元数和节点数
- 清爽的VS开发字体 -- Consolas
- java中复数_Java中的复数
- 1008 : 美元和人民币
- 自考02323《操作系统概论》第一章操作系统简介——思维导图
- 开发网页需要学什么?
- 使用Xshell远程连接CentOS7全过程,包括遇到的各种问题集合及解决方案
- CDA以API为数据源
热门文章
- 腾讯云服务器Lighthouse和CVM区别
- stm32用杜邦线与中断模拟led灯开关
- 服务器装系统bios设置方法,u盘重装系统bios设置步骤 bios设置U盘启动详解
- 引用腾讯地图时出现”鉴权失败,请传入正确的key“
- Django默认用户模型类和父类 AbstractUser 介绍
- scratch趣味编程——挖矿小游戏
- 基于Trie树实现拼音搜索自动补全
- Android使用DatePickerDialog日期控件使用主题android:Theme.Holo.Light.Dialog有白边的问题解决
- 通过银行卡号查询银行卡类型接口
- 如何在手机和电脑之间共享文件以及共享模拟器网络给电脑