codeforces 961B Lecture Sleep

题目链接: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 }
View Code

 

posted @ 2018-04-10 20:25  BadboyQAQ  阅读(346)  评论(0编辑  收藏  举报