这道题让我很感谢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; }