• CodeForces


    期末考试快到了,qdu的考试周一共有n天,你要在这n天里考m门课,这m门课从1到m编号。

    我们知道这n天内的每一天可以考哪一门课,当然,也有可能有一天不能考试。 每天只能考一次试。

    你每天可以做三件事,考试、复习、或者休息。

    每门课都有一个需要复习的天数,比如第i门课需要复习ai天,只有当你总共复习了ai天的第i门课,你才能在考试中通过这第i门课。当然,你也不用非得连续几天都复习一门课,可以穿插着复习,只要最后的天数满足就可以了。

    为了尽早回家,你想计算出考完这m门课最少需要多少天?当然每门课都要考通过。要是怎么也不能全部通过,那就输出-1。

    还是不太理解题意的话,就去看hint。

    Input

    第一行两个整数 n 和 m (1 ≤ n, m ≤ 105) — n天,m门课。

    第二行n个整数 d1, d2, ..., dn (0 ≤ di ≤ m),  di 表示这一天可以考第di 门课。如果 di 为 0,那么这一天只能复习或休息,不能考试。

    第三行m个整数 a1, a2, ..., am (1 ≤ ai ≤ 105),  ai 表示通过第i门课至少要复习准备这门课多少天。

    Output

    输出一个整数。 — 最少多少天可以通过全部的考试。 如果不可能输出-1。

    Sample Input
    Input1:
    7 2
    0 1 0 2 1 0 2
    2 1
     
    Input2:
    10 3
    0 0 1 2 3 0 2 0 1 2
    1 1 4
     
    Input3:
    5 1
    1 1 1 1 1
    5
     
    Sample Output
    Output1:
    5
     
    Output2:
    9
     
    Output3:
    -1
    Hint

    第一个样例: 第一天和第二天复习科目 1 然后在第五天通过, 第三天复习科目2然后在第四天通过。

    第二个样例: 前四天复习科目 3 然后在第五天通过。第六天复习科目 2 然后在第七天通过。第八天复习科目1然后在第九天通过。

    第三个样例:时间不够根本通过不了考试。




     1 #include<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 #include<queue>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<cmath>
     8 using namespace std;
     9 #define maxn 100005
    10 typedef long long LL;
    11 int d[maxn], a[maxn];
    12 int n, m;
    13 bool jud(int x) {
    14     int vis[maxn] = { 0 };
    15     int tj = 0;
    16     int sum = 0;
    17     for (int i = x; i > 0; i--) {
    18         if (d[i] && !vis[d[i]]) {
    19             vis[d[i]] = 1;
    20             sum += a[d[i]];
    21             tj++;
    22         }
    23         else if (sum) {//这句考虑的顺序问题,复习应该在考好之前而不是之后
    24             sum--;
    25         }
    26     }
    27     if (tj == m&&!sum)
    28         return true;
    29     return false;
    30 }
    31 int main() {
    32     while (~scanf("%d%d", &n, &m)) {
    33         for (int i = 1; i <= n; i++) {
    34             scanf("%d", &d[i]);
    35         }
    36         for (int i = 1; i <= m; i++) {
    37             scanf("%d", &a[i]);
    38         }
    39         int ans = -1;
    40         int l = 1, r = n;
    41         while (l <= r) {
    42             int mid = l + r >> 1;
    43             if (jud(mid)) {
    44                 r = mid - 1;
    45                 ans = mid;
    46             }
    47             else {
    48                 l = mid + 1;
    49             }
    50         }
    51         printf("%d
    ", ans);
    52     }
    53 }
  • 相关阅读:
    【愚人节快乐】拥抱Bootstrap,FineUI新版效果超炫!
    FineUIMvc新特性速递(大间距模式,隐藏菜单垂直滚动条)
    FineUI经典项目展示(2)基础管理系统(附在线演示)
    FineUIMvc随笔(6)对比WebForms和MVC中表格的数据库分页
    FineUIMvc随笔(5)UIHelper是个什么梗?
    FineUIMvc随笔(4)自定义回发参数与自定义回发
    FineUIMvc随笔(3)不能忘却的回发(__doPostBack)
    FineUI经典项目展示(1)生产在线管理系统
    FineUIMvc随笔(2)怎样在控件中嵌套 HTML
    FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!
  • 原文地址:https://www.cnblogs.com/zhangbuang/p/10299040.html
Copyright © 2020-2023  润新知