这题可以用二分答案来做

那么为什么可以用二分答案呢?

答案当然是满足了单调性。 假设用\(x\)天能够考完所有试,那么用大于$x $天必定也能够考完所有试,所以满足了单调性,我们就可以二分答案

那么如何\(check\)呢?考虑一下贪心

贪心思路:在二分的\(mid\)天之前找到每一科考试可以考的最后一天,只在这一天去考这一门科目,其它时间积攒复习时间,若在\(mid\)前这个科目可考的最后一天出现了,而此时积攒的复习时间并不足以考过这门科目,则说明用\(mid\)天不能考完这些科目,否则就让计数器\(cnt\)的值加一,表示现在已经考了\(cnt\)门,最后检验一下\(cnt\)是否等于\(m\),若不等于则说明还有科目在\(mid\)天前没有出现,增大范围,否则缩小范围,让\(ans\)等于\(mid\)。

代码如下

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int A = 1e5 + 11;
const int B = 1e6 + 11; inline int read() {
char c = getchar(); int x = 0, f = 1;
for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
return x * f;
} int n, m, all, cnt;
int d[A], w[A], a[A], la[A]; inline bool check(int x) {
memset(la, 0, sizeof(la));
for(int i = 1; i <= n; i++) a[i] = d[i];
for(int i = 1; i <= x; i++) if(a[i]) a[la[a[i]]] = 0, la[a[i]] = i;
int tl = 0, cnt = 0;
for(int i = 1; i <= x; i++) {
if(a[i]) { tl -= w[a[i]]; if(tl < 0) return 0; else cnt++; }
else tl++;
}
return cnt == m;
} int main() {
n = read(), m = read();
if(n < m) return puts("-1"), 0;
for(int i = 1; i <= n; i++) d[i] = read();
for(int i = 1; i <= m; i++) w[i] = read(), all += w[i];
if(all > n) return puts("-1"), 0;
int l = 0, r = n, ans = -1;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
return cout << ans << '\n', 0;
}

最新文章

  1. 游标的使用之压缩数据库Log文件
  2. 【MySQL】MySQL 如何实现 唯一随机数ID
  3. jQuery之元素操作及事件绑定
  4. JVM内存结构之二--新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数
  5. git 创建分支并切换
  6. SQL高级查询
  7. Netbeans搭建Android环境
  8. RxJava(11-线程调度Scheduler)
  9. LNMP shell
  10. 【论文速读】ChengLin_Liu_ICCV2017_Deep_Direct_Regression_for_Multi-Oriented_Scene_Text_Detection
  11. 洛谷P1309 瑞士轮(归并排序)
  12. MySQL中几个关于时间/时区的变量
  13. bootstrap fileinput组件的使用
  14. LeetCode - Top K Frequent Words
  15. 【Hi3516】 uboot下烧写BSP
  16. SP4487 GSS6 - Can you answer these queries VI
  17. html &lt;label&gt;标签
  18. Oracle数据类型之nchar
  19. spring web 生命周期理解
  20. FreeRTOS 调试方法(printf---打印任务执行情况)

热门文章

  1. 从0系统学Android--3.6 RecyclerView
  2. IDEA新建Spring配置文件的方法
  3. MySQL Error Log 文件丢失导致The server quit without updating PID file启动失败的场景
  4. Linux中ps -elf和ps aux的区别
  5. volatile可见性案例-黑马
  6. C语言程序设计100例之(24):数制转换
  7. IT兄弟连 HTML5教程 多媒体应用 HTML图像地图
  8. iOS的常用类库
  9. 在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)
  10. idea中tomcat乱码