小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。
主要是优化算法
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n, k;
while (cin>>n>>k)
{
vector<int> A(n + 1, 0);
A[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> A[i];
}
//在输入是否清醒的时候累加清醒时的知识点兴趣值
int awake = 0;
/*
用T[i]表示从[1,i]区间内睡着时候的知识点兴趣值,
则求t时刻叫醒时增加的兴趣值就等于T[t+k-1]-T[t-1],
不用再次计算遍历整个T[i]
*/
vector<int> T(n + 1, 0);
T[0] = 0;
int t;
for (int i = 1; i <= n; i++)
{
cin >> t;
if (t == 1)
awake += A[i];
T[i] = T[i-1]+A[i]*(1-t);
}
int maxT = 0;
for (t = 1; t <= n; t++)
{
int tend = min(t + k - 1, n), tbegin = t - 1;
maxT = max(maxT, T[tend] - T[tbegin]);
}
cout << maxT + awake << endl;
}
}
京公网安备 11010502036488号