zoukankan      html  css  js  c++  java
  • ARC100D Equal Cut

    传送门

    分析

    首先我们想到的肯定是n^3暴力枚举,但这显然不行。然后我们想到的就是二分了,但这题没有什么单调性,所以二分也不行。这时候我就想到了先枚举找出p2的位置再在它的左右两边找到p1和p3,但是良心的样例2告诉了我这样是不行的,因为让p2的位置最优并不意味着整体最优。之后我发现可以枚举p2,在这个基础上枚举p1和p3,因为如果之前p1或p3向右移了几位那它在之后一定不会向左移,这样我们有优化了一小点。根据这个思路我们不难再联想到如果p1+1的答案不如现在的p1优,那p1+2也一定不会更优,这个结论易证。所以我们便得到了一个O(n)做法。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    #define sp cout<<"---------------------------------------------------"<<endl
    const long long inf=2e15+7;
    long long pre[200010]; 
    int main(){
          long long n,i,x,p1,p2,p3,minn,P;
          cin>>n;
          for(i=1;i<=n;i++){
              scanf("%lld",&x);
              pre[i]=pre[i-1]+x;
          }
          p1=1,p2=2,p3=3;
          long long ans=inf;
          for(p2;p2<n;p2++){
            minn=inf;
            for(i=p1;i<p2;i++)
              if(abs(pre[i]-(pre[p2]-pre[i]))<minn){
                minn=abs(pre[i]-(pre[p2]-pre[i]));
                p1=i;
              }else break;
            minn=inf;
            if(p3<=p2)p3=p2+1;
            for(i=p3;i<=n;i++)
              if(abs((pre[i]-pre[p2])-(pre[n]-pre[i]))<minn){
                minn=abs((pre[i]-pre[p2])-(pre[n]-pre[i]));
                p3=i;
              }else break;
            minn=inf;long long maxn=0;
            minn=min(pre[p1],min(pre[p2]-pre[p1],min(pre[p3]-pre[p2],pre[n]-pre[p3])));
            maxn=max(pre[p1],max(pre[p2]-pre[p1],max(pre[p3]-pre[p2],pre[n]-pre[p3])));
            ans=min(ans,maxn-minn);
          }
          cout<<ans<<endl;
          return 0;
    }
  • 相关阅读:
    sql server 2008 r2安装详解 (转)
    SQL SERVER 与ORACLE常用函数比较(转)
    android色码对照表
    java小结
    如何查看android虚拟机的目录及文件
    java中的Serializable接口的作用
    android布局属性详解
    android 如何连接sqlserver数据库
    android 中Network error IOException: failed to connect to /127.0.0.1 (port 1433): connect failed: ECONNREFUSED (Connection refused)
    IDEA 将项目打包war包
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9346749.html
Copyright © 2011-2022 走看看