Description
Input
Output
只打印一个整数 - 只用一次技巧来唤醒Mishka,他可以记下的定理的最大数量。
Sample Input
Input
6 3 1 3 5 2 5 4 1 1 0 1 0 0
Output
16
Hint
在示例情况下,最好的方法是在第三分钟开始时使用。 那么Mishka将能记下的定理数将等于16。
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int n,k,i,j,a[100010],b[100010],ans1=0,ans=0,maxx=-1;
scanf("%d%d",&n,&k);
for(i=0; i<=n-1; i++)
scanf("%d",&a[i]);
for(i=0; i<=n-1; i++)
{
scanf("%d",&b[i]);
if(b[i]==1)
ans+=a[i];
}
for(i=0; i<=k-1; i++)
{
if(b[i]==0)
ans1+=a[i];
}
i=0;j=i+k-1;
while(1)
{
maxx=max(maxx,ans+ans1);
if(b[i]==0)
ans1-=a[i];
i++;
j++;
if(j==n)
break;
if(b[j]==0)
ans1+=a[j];
}
printf("%d\n",maxx);
}
正常思维:
#include <iostream>
#include<stdio.h>
using namespace std;
int a[100101],t[101001],g[100001]= {0};
int main()
{
int n,k,i,j,max1=0,sum=0,h=0;
scanf("%d%d",&n,&k);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
for(i=1; i<=n; i++)
scanf("%d",&t[i]);
for(i=1; i<=k; i++)
if(t[i]==0)//先将第一段算出来
g[1]+=a[i];
int beg=1,endd=k;
for(i=1; i<=n; i++)
if(t[i]==1)//把本来能记下的记下来
sum+=a[i];
for(i=2; i<=n-k+1; i++)
{
if(t[beg]==0&&t[endd+1]==0)//都等于0把前面的减掉后面的加上
g[i]=g[i-1]-a[beg]+a[endd+1];
if(t[beg]!=0&&t[endd+1]==0)
g[i]=g[i-1]+a[endd+1];
if(t[beg]==0&&t[endd+1]!=0)
g[i]=g[i-1]-a[beg];
if(t[beg]!=0&&t[endd+1]!=0)
g[i]=g[i-1];
beg++;
endd++;
}
for(i=1; i<=n-k+1; i++)
if(g[i]>max1)
max1=g[i];
printf("%d\n",sum+max1);
return 0;
}