输入描述:第一行(1<=n,k<=10^5),表示这堂课持续多少分钟,以及叫醒该同学能使他保持清醒的时间
第二行,a1,a2,a3...an(1~10^4)表示同学对每分钟知识点的感兴趣评分。
第三行,t1,t2,t3...tn表示同学是否清醒,0表示不清醒,1表示清醒
输出:同学听到知识点的最大兴趣值
例子: 6 3
1 3 5 2 5 4
1 1 0 1 0 0
解题思路:动态规划:从i=0叫醒 0 1 2
从i=1 叫醒 1 2 3
从 i=2叫醒 2 3 4
从 i=3叫醒 3 4 5
i | 0 | 1 | 2 | 3 | 4 | 5 |
inter_degree | 1 | 3 | 5 | 2 | 5 | 4 |
awak | 1 | 1 | 0 | 1 | 0 | 0 |
now | 6 | 6 | 11 | 11 | 11 | 15 |
res | 6 | 6 | 11 | 11 | 16 | 16 |
代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
vector<int>inte_degree(n);
vector<int>awak(n);
for (int i = 0; i < n; i++){
cin >> inte_degree[i];
}
int now = 0;
for (int i = 0; i < n; i++){
cin >> awak[i];
now += awak[i] * inte_degree[i];
}
int res = now;
for (int i = 0; i < n; i++){
now += (!awak[i])*inte_degree[i];
if ((i+1) >= k){ //if的判定条件超过一次叫醒清醒的时间,每3分钟为一次
res = max(res, now);
now -= (!awak[i - k+1])*inte_degree[i - k+1];//now代表下一个三个组合起始数值
}
}
cout << res << endl;
//system("pause");
return 0;
}
参考:https://blog.csdn.net/u011268787/article/details/81591883