Codeforces 732D [二分 ][贪心]

/*
不要低头,不要放弃,不要气馁,不要慌张
题意:
n天进行m科考试,每科考试需要a的复习时间,n天每天最多可以考一科。并且指定哪天考哪科。
注意考试那天不能复习。
问最少需要多少天可全部通过考试。

思路:
转化为判定性问题。二分天数。
然后贪心,在规定天数以内,最后一天通过即可。需要保证每一科最后一天之前剩下还没考试的科目都来得及复习。(同时注意要要加上考试时间)
最后还要判定是不是所有的科目都通过了。
*/

#include<bits/stdc++.h>
using namespace std;
long long a[100050],b[100050],sum;
int n,m;
bool pf(int la){
    set<int>mm;
    long long tt=sum;
    for(int i=la;i>=1;i--){
        if(a[i]){
            if(mm.find(a[i])==mm.end()){
                int gg=mm.size();
                if(tt+m-gg<=i){
                    mm.insert(a[i]);
                    tt-=b[a[i]];
                }
                else return 0;
            }

        }
    }
    if(!tt)return 1;
    else return 0;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",a+i);
    for(int i=1;i<=m;i++)scanf("%lld",b+i);
    for(int i=1;i<=m;i++)sum+=b[i];
    int l=1,r=n;
    while(l<=r){
        int mid=(l+r)>>1;
        if(pf(mid))r=mid-1;
        else l=mid+1;
    }
    if(l>n)puts("-1");
    else printf("%d
",l);
}
原文地址:https://www.cnblogs.com/tun117/p/5978829.html