题目:小s上课的时候容易犯困,但又想听一些自己感兴趣的内容,我们将知道小s对每分钟的内容的感兴趣程度,以数字量化。以及每分钟小s醒着还是在睡觉,我们可以叫醒小s一次,小s醒后k分钟内不会睡着,要最大化小s听到感兴趣的内容。
要求:
输入
第一行:课堂持续时间n,小s坚持的时间k。(1<=n,k<10^4)
第二行:a1,a2。。。。。an。ai表示第i分钟内容的感兴趣程度。
第三行:t1,t2.。。。。。tn。ti表示第i分钟醒着或者睡着,1代表醒着,0为睡着。
输出:能获得最多感兴趣的内容的值,后面用res表示。(将醒着的分钟数的ai相加)
思路:
特殊情况,k>=n(输出全部ai总和)
首先算出不叫醒小s时,小s的res为多少。
然后遍历叫醒小s的分钟数(从第1分钟到第n-k分钟),计算每种情况下,k分钟内小s原本睡着的时间的ai总和。找到这些情况中总和最大的那个数max。
最后输出res+max。
通过测试的代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
unsigned int n, k;
vector<int> a;
vector<int> t;
int tmpa;
int tmpt;
cin >> n;
while (getchar() != '\n')
{
cin >> k;
}
while (cin >> tmpa&&a.size()<n)
{
a.push_back(tmpa);
if (getchar() == '\n')
break;
}
while (cin >> tmpt&&t.size()<n)
{
t.push_back(tmpt);
if (getchar() == '\n')
break;
}
int sum=0;
for (unsigned int i = 0; i < a.size(); i++)
sum += a[i];
if (k >= n)
{
cout << sum << endl;
return 0;
}
int res = 0;
for (int i = 0; i < n; i++)
{
if (t[i])
res += a[i];
}
if (k == 0)
{
cout << res << endl;
return 0;
}
int max = 0;
for (unsigned int i = 0; i <= n - k; i++)
{
int tmpmax = 0;
for (unsigned int j = i; j < i + k; j++)
{
if (!t[j])
tmpmax += a[j];
}
if (tmpmax > max)
max = tmpmax;
}
cout << res + max << endl;
return 0;
}