zoukankan      html  css  js  c++  java
  • Lecture Sleep(尺取+前缀和)

    Description

    你的朋友Mishka和你参加一个微积分讲座。讲座持续n分钟。讲师在第i分钟讲述ai个定理。
     
    米什卡真的对微积分很感兴趣,尽管在演讲的所有时间都很难保持清醒。给你一个米什卡行为的数组t。如果Mishka在演讲的第一分钟睡着了,那么ti将等于0,否则它将等于1.当米什卡醒来时,他写下讲师所讲述的所有定理 。否则,他什么都不写。
     
    你知道一些方式让Mishka直线醒过来持续k分钟。但是,您只能使用一次。你可以在1和n - k + 1之间的任何一分钟开始使用它。如果你在一分钟内使用它,那么Mishka会在几分钟内醒来,并且会写下讲师所讲的所有定理。
     
    你的任务是计算Mishka能够记下的最大定理数,如果你只用一次技巧来唤醒他。

    Input

    输入的第一行包含两个整数n和k(1≤k≤n≤105) - 以分钟为单位的讲座持续时间以及可让Mishka保持清醒状态的分钟数。
     
    输入的第二行包含n个整数a1,a2,... an(1≤ai≤104) - 讲师在第i分钟讲述的定理数。
     
    输入的第三行包含n个整数t1,t2,... tn(0≤ti≤1) - 讲座第i分钟Mishka行为的类型。

    Output

    只打印一个整数 - 只用一次技巧来唤醒Mishka,他可以记下的定理的最大数量。

    Sample Input

    Input

    6 3
    1 3 5 2 5 4
    1 1 0 1 0 0
    

    Output

    16





     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 int main()
     5 {
     6     int n,k,sum=0,tmp=0,ans=-1,x,j,i;
     7     int a[100010];
     8     int vis[100010];
     9     scanf("%d%d",&n,&k);
    10     for(i=0;i<n;i++)
    11     {
    12         scanf("%d",&a[i]);
    13     }
    14     for(i=0;i<n;i++)
    15     {
    16         scanf("%d",&vis[i]);
    17         if(vis[i])///只要是醒着的时候都能记住定理
    18         {
    19             sum=sum+a[i];
    20         }
    21     }
    22     for(i=0;i<k;i++)
    23     {
    24         if(!vis[i])
    25         {
    26             tmp=tmp+a[i];///tmp储存的是使用某种方法之后能记住的定理的增量
    27         }
    28     }
    29     i=0;
    30     j=i+k-1;///以使用某种方法的作用时间作为尺取的尺度
    31     while(1)
    32     {
    33         ans=max(ans,sum+tmp);
    34         if(!vis[i])
    35         {
    36             tmp=tmp-a[i];
    37         }
    38         i++;
    39         j++;
    40         if(j==n)///尺取到头就要终止遍历
    41         {
    42             break;
    43         }
    44         if(!vis[j])
    45         {
    46             tmp=tmp+a[j];
    47         }
    48     }
    49     printf("%d
    ",ans);
    50     return 0;
    51 }

    前缀和的方法

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 using namespace std;
     5 int a[100010];
     6 int vis[100010];
     7 int sum[100010];
     8 int per[100010];
     9 int main()
    10 {
    11     int n,k,i,j,maxt;
    12     int x,y,z;
    13     scanf("%d%d",&n,&k);
    14     for(i=1; i<=n; i++)
    15     {
    16         scanf("%d",&a[i]);
    17         sum[i]=sum[i-1]+a[i];///sum储存的是前i项老师讲的定理和
    18     }
    19     for(i=1; i<=n; i++)
    20     {
    21         scanf("%d",&vis[i]);
    22         if(vis[i])
    23         {
    24             per[i]=per[i-1]+a[i];///per储存的是前i项mishka听到的定理和
    25         }
    26         else
    27         {
    28             per[i]=per[i-1];
    29         }
    30     }
    31     maxt=0;
    32     for(i=1; i<=n-k+1; i++)
    33     {
    34         x=per[i-1];///之前听到的定理
    35         y=sum[i+k-1]-sum[i-1];///中间老师讲到的定理,在这里可以使用某一种方法,使得可以听到老师所讲的内容
    36         z=per[n]-per[i+k-1];///后面听到的定理
    37         maxt=max(maxt,x+y+z);
    38     }
    39     printf("%d
    ",maxt);
    40     return 0;
    41 }

    看到一个大神有更为优化的前缀和的方法

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 using namespace std;
     5 int a[100010];
     6 int main()
     7 {
     8     int n,k,i,j,maxt,ans,b;
     9     int x,y,z;
    10     scanf("%d%d",&n,&k);
    11     ans=0;
    12     maxt=0;
    13     for(i=1; i<=n; i++)
    14     {
    15         scanf("%d",&a[i]);
    16     }
    17     for(i=1; i<=n; i++)
    18     {
    19         scanf("%d",&b);
    20         if(b)
    21         {
    22             ans=ans+a[i];///ans里面储存的是上课能听到的所有定理
    23             a[i]=0;///听到了的重置为0
    24         }
    25         a[i]=a[i-1]+a[i];///a[i]///里面储存的是前i项上课没有听到的
    26     }
    27     for(i=k; i<=n; i++)
    28     {
    29        maxt=max(maxt,a[i]-a[i-k]);
    30     }
    31     printf("%d
    ",maxt+ans);
    32     return 0;
    33 }
  • 相关阅读:
    svg入门
    常用颜色对照表
    字节序
    eclipse常用快捷键
    jenkins 安装
    redis
    Linux
    jenkins
    jenkins
    jenkins- 自动部署java包至远程服务器
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9217092.html
Copyright © 2011-2022 走看看