zoukankan      html  css  js  c++  java
  • hdu 6047: Maximum Sequence (2017 多校第二场 1003)【贪心】

    题目链接

    可以贪心写,先把b数组按从小到大的顺序排个序,根据b[i]的值来产生a[n+i]

    借助一个c数组,c[i]记录,j从i到n,a[j]-j的最大值,再加上一个实时更新的变量ma,记录从n+1到当前之前的a[n+i]-(n+i)的最大值,每次把max(c[b[i]],ma)的值赋给a[n+i]

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    
    const int N=3e5+7;
    const int mod=1e9+7;
    
    int n;
    int a[N],b[N],c[N];
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            for(int i=1;i<=n;i++) scanf("%d",&b[i]);
            sort(b+1,b+1+n);
            c[n]=a[n]-n;
            for(int i=n-1;i>0;i--) c[i]=max(c[i+1],a[i]-i);
            //c[i]:  max{a[j]-j| i<=j<=n}
            LL ans=0;
            int ma=-mod;
            //ma: max{a[j]-j| n<j<n+i
            for(int i=1;i<=n;i++)
            {
                int t=max(c[b[i]],ma);    //t: a[n+i]
                ma=max(ma,t-(n+i));        //a[n+i] in,update ma 
                ans=(ans+t)%mod;    
            }
            printf("%lld
    ",ans);
        }
    }
  • 相关阅读:
    接口
    多态
    封装
    初识继承
    对象的行为
    类、对象、包
    Java方法
    winform 报表的基本使用
    oracle配合C#的使用
    sql面试语句与后台调用js提示语句
  • 原文地址:https://www.cnblogs.com/Just--Do--It/p/7250037.html
Copyright © 2011-2022 走看看