Codeforces Round #377 (Div. 2)-D. Exams

傳送門

因爲天數越大通過所有考試的可能性就越大,具有單調性所以可以二分天數,然後check的話,就要用到貪心的思想從後往前掃(因爲越晚考試複習的時間就越多),設變量統計1到mid通過的考試的數量,還有通過這些考試所需要的複習時間。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int vis[maxn],a[maxn],d[maxn],n,m;
bool check(int mid)
{
    int need=0,cnt=0;//need表示通過cnt個考試還需要的總的複習時間
    for(int i=1;i<=m;i++) vis[i]=0;
    for(int i=mid;i>=1;i--)
    {
        if(d[i]&&!vis[d[i]])
        {
            need+=a[d[i]];
            vis[d[i]]=1;
            cnt++;
        }
        else
            if(need>0) 
                need--;
    }
    if(cnt!=m||need!=0)
        return false;
    else
        return true;


}
int main()
{
    int ans=-1,low,high,mid;
    scanf("%d %d",&n,&m);
    low=m;
    for(int i=1;i<=n;i++)
        scanf("%d",&(d[i]));
    for(int i=1;i<=m;i++)
        scanf("%d",&(a[i])),low+=a[i];
    high=n;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(check(mid))
        {
            ans=mid;
            high=mid-1;
        }
        else
            low=mid+1;
    }
    printf("%d\n",ans);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章