zoukankan      html  css  js  c++  java
  • AGC040E Prefix Suffix Addition

    Link
    考虑将({a_n})拆成({x_n})({y_n})的和,其中(x_n)是由多个不减序列相加构成,({y_n})是由多个下升序列相加构成。
    我们假定(x_0=y_0=x_{n+1}=y_{n+1}=0),那么我们需要的最小操作次数就是(sumlimits_{i=1}^n[x_{i+1}<x_i]+sumlimits_{i=1}^n[y_i>y_{i-1}])
    这个东西是没有最优子结构的,因此我们不能直接贪心。
    依旧考虑从小到大贪心,不难发现对于代价相同的方案,(x_i)小的一定更优。
    而且对于代价比当前最优方案代价要大至少(2)的方案,它一定不会更优。
    因此我们存下代价最小和严格次小的两个方案即可。

    #include<cstdio>
    #include<algorithm>
    int a[200007],v[2];
    int main()
    {
        int n,ans=0;
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%d",a+i);
        for(int i=1,now=0;i<=n+1;++i)
        {
    	int p[2]{0,a[i]-now},next[3]{1000000000,1000000000,0},d;
    	if(p[0]<p[1]) std::swap(p[0],p[1]);
    	for(int j=0;j<2;++j) for(int k=0;k<2;++k) next[j+k]=std::min(std::max(v[j]+p[k],0),next[j+k]);
    	d=next[0]>a[i],ans+=d,now=a[i];
    	for(int j=0;j<2;++j) v[j]=next[j+d];
        }
        printf("%d",ans);
    }
    
  • 相关阅读:
    系统幂等设计
    一文读懂消息队列一些设计
    DDD应对运营活动系统腐化实践
    一文读懂DDD
    阿里是如何处理分布式事务的
    核心交易系统架构演进
    系统服务化
    重构系统的套路-写有组织的代码
    数组生成树形结构
    js 对象全等判断
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12890226.html
Copyright © 2011-2022 走看看