因爲天數越大通過所有考試的可能性就越大,具有單調性所以可以二分天數,然後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;
}