course

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

猜你喜欢

转载自www.cnblogs.com/chen-1/p/9479315.html
今日推荐