网易62:瞌睡
小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的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; } }