题目
小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。
思路
本题中分数最高的即为所有没有睡觉的分数以及每个k时间段内会睡觉的分数的最大值,因此:
- 轮询计算出所有不会睡觉的分数值
- 轮询每个k时间段内睡觉的总数的最大值
输入描述:
第一行 n, k (1 <= n, k <= 105) ,表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。
第二行 n 个数,a1, a2, … , an(1 <= ai <= 104) 表示小易对每分钟知识点的感兴趣评分。
第三行 n 个数,t1, t2, … , tn 表示每分钟小易是否清醒, 1表示清醒。
输出描述
小易这堂课听到的知识点的最大兴趣值
示例
输入:
6 3
1 3 5 2 5 4
1 1 0 1 0 0
输出:
16
代码
#include <iostream>
#include <vector>
using namespace std;
class Solution{
public:
int maxGrade_interest(int n, int k, vector<int> grade_interest,
vector<int> is_interest){
int maxGrade(0),result(0);
// 轮询计算每个k时间段内会睡觉的分数和,并取出最大值
for (int i = 0; i < n; ++i) {
if (!is_interest[i]){
maxGrade = 0;
// 使用 i+j < n 防止越界访问
for (int j = 0; j < k && i+j<n; ++j)
if (!is_interest[i+j])
maxGrade += grade_interest[i+j];
// 更新最大值
if (result < maxGrade)
result = maxGrade;
// 若最后剩余已经不足k分钟,则跳出循环;要留意,如果用牛客的oj,会因此而超时
if (i+k>=n)
break;
}
}
// 计算所有没有睡着的时间内的分数
for (int m = 0; m < n; ++m)
if (is_interest[m])
result += grade_interest[m];
return result;
}
};
int main(){
int n(0),k(0);
cin >> n >> k;
vector<int> grade_interest(n,0), is_interest(n,0);
for (int i = 0; i < n; ++i)
cin >> grade_interest[i];
for (int j = 0; j < n; ++j)
cin >> is_interest[j];
Solution re;
int result = re.maxGrade_interest(n,k,grade_interest,is_interest);
cout << result;
return 0;
}