Codeforces_732_D

http://codeforces.com/problemset/problem/732/D

二分查找。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

int n,m,d[100005],a[100005],ok[100005];

int f(int x)
{
    memset(ok,0,sizeof(ok));
    long long sum = 0;
    for(int i = x;i >= 1;i--)
    {
        if(d[i] && !ok[d[i]])
        {
            ok[d[i]] = 1;
            sum += a[d[i]];
        }
        else if(sum)    sum--;
    }
    for(int i = 1;i <= m;i++)
    {
        if(!ok[i])  return 0;
    }
    if(sum) return 0;
    return 1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;i++)   scanf("%d",&d[i]);
    for(int i = 1;i <= m;i++)   scanf("%d",&a[i]);
    int l = 1,r = n;
    while(l < r)
    {
        int mid = (l+r)/2;
        if(f(mid))  r = mid;
        else    l = mid+1;
    }
    if(f(l))    printf("%d
",l);
    else    printf("-1
");
    return 0;
}
原文地址:https://www.cnblogs.com/zhurb/p/6101006.html