这道题让我很感谢LCH!!!
题目:
LCH假期过得意犹未尽,所以上信息课的时候不免打瞌睡。但是他不希望落下老师讲的知识点,所以希望老师讲到重要地方的时候叫醒他。
现在高老师告诉你每节课每分钟知识点的重要程度,并且以分数量化。
LCH会告诉你他的睡眠计划(每分钟是睡着还是清醒),但他实在太困了,所以希望你只叫醒他一次,叫醒后他会在接下来的K分钟保持清醒,然后恢复他的睡眠计划(按照给出计划睡着或者清醒)。
作为好朋友你当然希望他在有限时间内获得最多的知识,所以你希望选择一种叫醒方案,让他获得的知识量最大。
数据输入:
第一行输入n和k,用空格隔开,表示这堂课的总时间和叫醒一次能使LCH保持清醒的时间。
第二行输入n个用空格隔开的数,表示这节课每分钟知识点的重要程度分值ai。
第三行输入n个用空格隔开的数,表示每分钟LCH的睡眠计划,1表示他这一分钟清醒,0表示睡眠。
数据输出:
LCH这堂课收获的最大知识量。
题解:可以用前缀和,定义一个sum数组,sum[i]=a[1]+a[2]+a[3]+......a[i];也就是sum[i]=sum[i-1]+a[i];接下来就很简单了,详情请见代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
struct IT
{
int a;
int flag;
};
IT p[100001];
int n,m;
int max_s=-2147483647;
int sum2[100001];
int fnd(int st)
{
return sum2[st+m-1]-sum2[st-1];
}
int main()
{
//freopen("course.in","r",stdin);
//freopen("course.out","w",stdout);
cin>>n>>m;
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i].a);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i].flag);
if(p[i].flag) sum+=p[i].a;
}
for(int i=1;i<=n;i++)
{
if(!p[i].flag) sum2[i]=sum2[i-1]+p[i].a;/
else sum2[i]=sum2[i-1];
}
for(int i=1;i<=n;i++)
{
if(fnd(i)>max_s)
{
max_s=fnd(i);
}
}
cout<<max_s+sum<<endl;
return 0;
}