loj #2348. 「JOI 2017/2018 决赛」美术展览

 

#2348. 「JOI 2017/2018 决赛」美术展览

 

题目描述

JOI 国将举行美术展,在美术展中将展出来自全国各地的各种美术品。

现在有 NNN 件候选美术品,编号为 111 至 NNN。每件艺术品有描述其尺寸与价值的两个整数,第 iii 件艺术品的尺寸为 AiA_iAi​​,其价值为 BiB_iBi​​。

美术展至少有一件美术品被选中并展示,并且举办美术展的展览馆足够大,所以展出所有的 NNN 件美术品也是可行的。为了符合 JOI 国人民的审美,我们想使得参展的美术品之间的尺寸之差不能太大。并且,我们想使得参展的美术品价值之和尽量大。因此,我们决定按照以下方式选定参展的美术品:

在参展美术品中,令 Amax 为所选美术品中最大的尺寸,Amin 为所选美术品中最小的尺寸。令 SSS 为所有参展美术品的总价值之和。给出候选美术品的数量以及其尺寸与价值,求 S(AmaxAmin) 的最大值。

输入格式

从标准输入中读取数据。

第一行包括一个整数 NNN,表示有 NNN 件候选美术品。

接下来 NNN 行,第 i+1i+1i+1 行给出两个整数 Ai,BiA_i, B_iAi​​,Bi​​,表示第 iii 件美术品的尺寸与价值。

输出格式

输出数据到标准输出中。

输出一行一个整数,表示 S(AmaxAmin) 的最大值。

样例

样例输入 1
3
2 3
11 2
4 5
样例输出 1
6
样例说明 1

在这个样例中,有三件候选美术品,其尺寸与价值分别为 2,11,42, 11, 42,11,4 与 3,2,53, 2, 53,2,5。如果我们选择第一件美术品与第三件美术品参展,我们有 S(AmaxAmin)=6。在所有参选美术品中,Amax=4,Amin=2,S=3+5=8。可以证明 S(AmaxAmin) 不超过 666。

样例输入 2
6
4 1
1 5
10 3
9 1
4 2
5 3
样例输出 2
7
样例输入 3
15
1543361732 260774320
2089759661 257198921
1555665663 389548466
4133306295 296394520
2596448427 301103944
1701413087 274491541
2347488426 912791996
2133012079 444074242
2659886224 656957044
1345396764 259870638
2671164286 233246973
2791812672 585862344
2996614635 91065315
971304780 488995617
1523452673 988137562
样例输出 3
4232545716

数据范围与提示

Subtask #1234
分值 10 20 20 50
NNN N≤16N\le 16N16 N≤300N \le 300N300 N≤5000N \le 5000N5000 N≤5×105N \le 5\times 10^5N5×105​​

对于所有输入数据,有 2N5×105,1Ai1015 (1iN),1Bi10(1iN)。

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 500010
using namespace std;
struct node{
    long long w,v;
    bool operator < (const node &b)const{
        return w<b.w;
    }
}a[maxn];
int n;
long long qread(){
    long long i=0,j=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')j=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){i=i*10+ch-'0';ch=getchar();}
    return i*j;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)a[i].w=qread(),a[i].v=qread();
    sort(a+1,a+n+1);
    long long tmp=1000000000000000LL,sum=0,ans=0;
    for(int i=1;i<=n;i++){
        tmp=min(tmp,sum-a[i].w);
        sum+=a[i].v;
        ans=max(ans,sum-tmp-a[i].w);
    }
    cout<<ans;
    return 0;
}
50分 枚举
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 500010
using namespace std;
struct node{
    long long w,v;
    bool operator < (const node &b)const{
        return w<b.w;
    }
}a[maxn];
int n;
long long qread(){
    long long i=0,j=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')j=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){i=i*10+ch-'0';ch=getchar();}
    return i*j;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)a[i].w=qread(),a[i].v=qread();
    sort(a+1,a+n+1);
    long long tmp=1000000000000000LL,sum=0,ans=0;
    for(int i=1;i<=n;i++){
        tmp=min(tmp,sum-a[i].w);
        sum+=a[i].v;
        ans=max(ans,sum-tmp-a[i].w);
    }
    cout<<ans;
    return 0;
}
100分 乱搞

 

posted @ 2018-04-15 14:59  Echo宝贝儿  阅读(208)  评论(0)    收藏  举报