窗口问题,遍历所有可能叫醒小易的时间点(即t[i]为0的点),取在这些时间点叫醒小易k分钟后可以额外获取的兴趣值的最大值。
注意:这里我第一次的代码只AC90%,后来找到原因出在这里:当窗口右侧刚好临界时,就可以break终止for循环了,这样可以节省时间。
最终结果=额外时间+基本时间;
//窗口问题,遍历所有可能叫醒小易的时间点,取在这些时间点叫醒小易k分钟后可以额外获取的兴趣值的最大值。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int solution(int i, int n, int k, vector<int>&a, vector<int>&t)
{
int extra_interest = 0;
if (i + k - 1 <= n - 1)//判断窗口的右侧是否越界
{
for (int j = i; j <= i + k - 1; j++)
{
if (t[j] == 0)
extra_interest += a[j];
}
}
else
{
for (int j = i; j <= n - 1; j++)
{
if (t[j] == 0)
extra_interest += a[j];
}
}
return extra_interest;
}
int main()
{
int n, k;
cin >> n >> k;
vector<int>a(n), t(n);
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
cin >> t[i];
int extra_interest = 0;
int interest = 0;
for (int i = 0; i < n; i++)
{
if (t[i] == 1)
interest += a[i];
}
for (int i = 0; i < n; i++)
{
if (i + k - 1 > n - 1)
{
extra_interest = max(extra_interest, solution(i, n, k, a, t));
break;
}
else
if (t[i] == 0)
{
extra_interest = max(extra_interest, solution(i, n, k, a, t));
}
}
cout << interest + extra_interest << endl;
system("pause");
return 0;
}
转载:https://blog.csdn.net/ShenHang_/article/details/104600111
查看评论