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