zoukankan      html  css  js  c++  java
  • 第三届中国计量大学ACM程序设计竞赛个人赛 B

    Birthday Gift

    传送门

    题意:给你n个元素,每个元素有两个性质,(x_i与y_i)。现在问你从其中取两个元素,定义他们的值为(min(x_i+y_j,x_j+y_i))

    题解:首先要将式子进行一个变形,使得里面的(min)值取向是一个确定的方向。(min(x_i+y_j,x_j+y_i)=min(x_i-y_i,x_j-y_j)+y_i+y_j)这个时候,如果把(x_i-y_i)排序的话,这个时候,(min)的取向其实就是一个确定的方向了。而且我们也只需要贪心的去选取就行了。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    
    typedef vector<int> VI;
    
    typedef pair<int,int> PII;
    
    inline int read(){
        int res=0, f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){res=res*10+ch-'0';ch=getchar();}
        return res*f;
    }
    
    const int N = 200005;
    
    const int MOD = 1000000007;
    
    template<typename T>
    void chmin(T& a, T b){if(a>b)a=b;}
    
    template<typename T>
    void chmax(T& a, T b){if(b>a)a=b;}
    
    struct Node{
        LL x, y;
        LL v;
        bool operator<(Node& a){
            return x-y<a.x-a.y;
        }
    }D[N];
    
    int main(){
        int n=read();
        for(int i=1;i<=n;++i)scanf("%lld",&D[i].x);
        for(int i=1;i<=n;++i){
            scanf("%lld",&D[i].y);
            D[i].v=D[i].x-D[i].y;
        }
    
        sort(D+1,D+n+1);
    
        LL res=0;
        LL mx=D[1].v+D[1].y;
    
        for(int i=2;i<=n;++i){
            chmax(res,mx+D[i].y);
            chmax(mx,D[i].v+D[i].y);
        }
    
        cout<<res;
    
        return 0;
    }
    
    
  • 相关阅读:
    PKU1008
    PKU 1007
    PKU 3983
    PKU 1005
    PKU1004
    PKU 1003解题
    new.target
    debugger 关键字
    React 高阶组件
    CSS|规范
  • 原文地址:https://www.cnblogs.com/JohnRan/p/13043244.html
Copyright © 2011-2022 走看看