CF961B Lecture Sleep 题解
wangyinghao · · 题解
题目传送门
考虑到如果用本题的题目翻译解释此题会比较难理解,因此提供一下自己的翻译。
题意
你的朋友 Mishka 和你一起参加了一个微积分课程,这个课程总共
Mishka 对这个课程非常有兴趣,但他无法保证在课上的每分钟都保持清醒状态。现在给定你一个序列
你知道一条秘籍可以使 Mishka 保持清醒
你的任务是使用秘籍使 Mishka 记下最多的定理。
思路
最笨的方法就是对于
我们定义两个指针
使用秘籍的最优方案应该是在 Mishka 错过最多定理的
AC Code
#include<iostream>
using namespace std;
int a[100005];
int t[100005];
int main(){
int n,k,x,y,cnt=0,maxx=0,maxt,maxw;//cnt是使用秘籍的区间ti=0时ai的和
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>t[i];
for(int i=1;i<=k;i++){
if(t[i]==0) cnt+=a[i];//预处理
}
x=1;
y=k;
while(x<=n-k+1){
if(cnt>maxx){//打擂台求最优方案
maxx=cnt;
maxt=x;//记录这个使用秘籍的区间
maxw=y;
}
if(t[x]==0) cnt-=a[x];//删掉左端点 Mishka在睡觉 错过了这些定理
x++;
y++;
if(t[y]==0) cnt+=a[y];//新加入右端点 Mishka不再睡觉 多记了一些定理
}
for(int i=1;i<=n;i++){
if(i>=maxt && i<=maxw && t[i]==0) continue;//区间内ti=0的情况已经算过了
maxx+=a[i]*t[i];//没算的再加
}
cout<<maxx;
return 0;
}