• 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;
    }
  • 相关阅读:
    论球迷和程序员
    山哥,你是怎么提高设计能力的?
    一个想休息的线程:JVM到底是怎么处理锁的?怎么不让我阻塞呢?
    由“面经”引发的思考
    99%的创业公司都不值得加入
    大牛是怎么炼成的?
    RMQ问题 与众不同 尚未攻克
    YbtOj例题:二叉堆3 龙珠游戏
    离散化模板
    YbtOJ练习:广搜 3 追捕小狗
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9346749.html
Copyright © 2020-2023  润新知