题目链接:http://codeforces.com/contest/961/problem/B
题意:小明同学上课老睡觉。一节课共有n分钟,然后给你一节课的每一分钟老师讲课的重点个数ai以及他的睡觉状态ti,1代表醒着,0代表睡觉。然后给你一个k,代表你可以在某一时刻叫醒小明,在接下来的k分钟小明将不会睡觉,但是只能叫一次。然后问你让你叫醒一次小明,他最多能学习多少重点。
分析:要使小明学习的重点最多,他醒着的时候学到的东西是不变的,叫醒他唯一增加的就是在叫醒区间内原本是0的那些时间的重点数。因此我们可以先计算小明原本醒着的时间学到的重点的总数,然后我们只需要再枚举i,计算i到i+k-1这段时间内0状态的重点个数,就是在i时刻叫醒他,他所能多学到的重点。对于i到i+k-1区间0状态的重点个数,只需要维护一个前缀和,就可以O(1)计算了,总时间复杂度合理
AC代码:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 long long a[1000005],t[1000005]; 6 int main(){ 7 ios_base::sync_with_stdio(0); 8 cin.tie(0); 9 int n,k; 10 cin>>n>>k; 11 for(int i=1;i<=n;i++){ 12 cin>>a[i]; 13 } 14 for(int i=1;i<=n;i++){ 15 cin>>t[i]; 16 } 17 long long result=0; 18 a[0]=0; 19 for(int i=1;i<=n;i++){ 20 if(t[i]==0) a[i]+=a[i-1]; 21 else { 22 result+=a[i]; 23 a[i]=a[i-1]; 24 } 25 } 26 long long re=0; 27 for(int i=1;i<=n-k+1;i++){ 28 re=max(re,a[i+k-1]-a[i-1]); 29 } 30 cout<<re+result<<endl; 31 return 0; 32 }