zoukankan      html  css  js  c++  java
  • 滑动窗口&最大连续和&寻找段落

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int maxn=1e6+7;
     5 int a[maxn],q[maxn],n,k;
     6 void getmin(){
     7     int head=1,tail=0;
     8     for(int i=1;i<=n;i++){
     9         while(head<=tail&&i-q[head]>=k) head++;
    10         while(head<=tail&&a[i]<=a[q[tail]]) tail--;
    11         q[++tail]=i;
    12         if(i>=k) cout<<a[q[head]]<<" ";
    13     }
    14 }
    15 void getmax(){
    16     int head=1,tail=0;
    17     for(int i=1;i<=n;i++){
    18         while(head<=tail&&i-q[head]>=k) head++;
    19         while(head<=tail&&a[i]>=a[q[tail]]) tail--;
    20         q[++tail]=i;
    21         if(i>=k) cout<<a[q[head]]<<" ";
    22     }
    23 }
    24 int main(){
    25     cin>>n>>k;
    26     for(int i=1;i<=n;i++) cin>>a[i];
    27     getmin();cout<<endl;
    28     getmax();
    29     return 0;
    30 }

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int maxn=2e5+7;
     5 int n,m,ans=-2147483647,a[maxn],h=1,t=1,q[maxn],num[maxn];
     6 int main(){
     7     cin>>n>>m;
     8     for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];} 
     9     for(int i=1;i<=n;i++){
    10         while(num[h]+m<i&&h<=t) h++;
    11         ans=max(ans,a[i]-q[h]);
    12         while(q[t]>=a[i]&&h<=t) t--;
    13         q[++t]=a[i];
    14         num[t]=i;
    15     }
    16     cout<<ans<<endl;
    17     return 0;
    18 } 

    关于这个的写法......

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 #define debug(x) cout<<#x<<" = "<<x<<endl;
     5 const int maxn=1e5+7;
     6 int n,s,t,head,tail;
     7 double l,r,mid;
     8 int q[maxn];
     9 double a[maxn],b[maxn],sum[maxn],num[maxn];
    10 bool flag;
    11 int main(){
    12     cin>>n>>s>>t;
    13     for(int i=1;i<=n;i++) cin>>a[i];
    14     l=-maxn;r=maxn;
    15     while(r-l>=1e-5){
    16         mid=(l+r)/2;
    17         for(int i=1;i<=n;i++) b[i]=a[i]-mid;
    18         for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i];
    19         q[1]=0;head=1;tail=0;flag=false;
    20         for(int i=1;i<=n;i++){
    21             if(i>s){
    22                 while(head<=tail&&sum[i-s]<sum[q[tail]]) tail--;
    23                 q[++tail]=i-s;//这有这之前的是合法的,后面暂时不合法
    24                 while(head<=tail&&i-t>q[head]) head++;
    25                 if(head<=tail&&sum[q[head]]<=sum[i]) {flag=true;break;}
    26             }
    27         }
    28         if(flag==true) l=mid;
    29         if(flag==false) r=mid;
    30     } 
    31     printf("%.3lf",mid);
    32     return 0;
    33 } 
  • 相关阅读:
    NoHttp封装--03 cookie
    NoHttp封装--02 自定义请求
    NoHttp封装--01
    Cookie管理 WebView同步
    Java注解处理器--编译时处理的注解
    Android联网更新应用
    shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
    磁盘管理 之 parted命令添加swap,文件系统
    磁盘管理之 raid 文件系统 分区
    用户管理上
  • 原文地址:https://www.cnblogs.com/lcan/p/9577055.html
Copyright © 2011-2022 走看看