大致题意:n天,m个考试科目,每一个考试科目有一定的准备时间,问在n天内完成所有科目所花的最少天数,(0代表改天不能考试),任意一天
(除0之外)可以有三种选择,考试,准备考试和休息,如果不能考完,则输出-1。
解题思路:二分答案
#include<stdio.h>
#include<string.h>
int n, m;
int a[100005], b[100005], flag[100005];
int Jud(int k);
int main(void)
{
int i, l, r, mid;
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
for(i=1;i<=m;i++)
scanf("%d", &b[i]);
l = 1, r = n;
while(l<r)
{
mid = (l+r)/2;
if(Jud(mid)==0)
l = mid+1;
else
r = mid;
}
if(Jud(l)==1)
printf("%d\n", l);
else if(Jud(r)==1)
printf("%d\n", r);
else
printf("-1\n");
return 0;
}
int Jud(int k)
{
int i, sum;
sum = 0;
memset(flag, 0, sizeof(flag));
for(i=k;i>=1;i--)
{
if(a[i]!=0 && flag[a[i]]==0)
{
flag[a[i]] = 1;
sum += b[a[i]];
}
else if(sum!=0)
sum--;
}
for(i=1;i<=m;i++)
{
if(flag[i]==0)
return 0;
}
if(sum!=0)
return 0;
return 1;
}