P1842 [USACO05NOV]奶牛玩杂技

P1842 奶牛玩杂技

题目描述

N N N 头奶牛中的每一头都有自己的重量 W i W_i Wi 以及强壮程度 S i S_i Si
一头牛支撑不住的可能性取决于它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,现在称该数值为风险值,风险值越大,这只牛撑不住的可能性越高。
您的任务是确定奶牛的排序,使得所有奶牛的风险值中的最大值尽可能的小。
链接

思路

我们先将奶牛按照顺序排列,如果有两头奶牛调换后结果可能更优,就调换他们。
现在有两头奶牛分别在从顶端数位置 i , j i,j i,j 上,满足 i < j ii<j ,调换他们的条件为: m a x ( W − s [ i ] , W ′ − s [ j ] ) > m a x ( W − s [ j ] , W ′ − w [ i ] + w [ j ] − s [ i ] ) max(W-s[i],W'-s[j])>max(W-s[j],W'-w[i]+w[j]-s[i]) max(Ws[i],Ws[j])>max(Ws[j],Ww[i]+w[j]s[i])
所以……就什么也没看出来。
当 W − s [ i ] > W ′ − s [ j ] , W − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] W − s [ i ] > W − s [ j ] , s [ i ] < s [ j ] W > W ′ − w [ i ] + w [ j ] w [ j ] < 0 , 舍 当 W − s [ i ] > W ′ − s [ j ] , W − s [ j ] ≤ W ′ − w [ i ] + w [ j ] − s [ i ] W − s [ i ] > W ′ − w [ i ] + w [ j ] − s [ i ] , w [ j ] < 0 , 舍 当 W − s [ i ] ≤ W ′ − s [ j ] , W − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] − s [ j ] > − w [ i ] + w [ j ] − s [ i ] , w [ i ] + s [ i ] > w [ j ] + s [ j ] 当 W − s [ i ] ≤ W ′ − s [ j ] , W − s [ j ] ≤ W ′ − w [ i ] + w [ j ] − s [ i ] W ′ − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] , w [ i ] + s [ i ] > w [ j ] + s [ j ] 当W-s[i]>W'-s[j],W-s[j]>W'-w[i]+w[j]-s[i]\\ W-s[i]>W-s[j],s[i]W'-w[i]+w[j]\\ w[j]<0,舍\\ 当W-s[i]>W'-s[j],W-s[j]\le W'-w[i]+w[j]-s[i]\\ W-s[i]>W'-w[i]+w[j]-s[i],w[j]<0,舍\\ 当W-s[i]\le W'-s[j],W-s[j]>W'-w[i]+w[j]-s[i]\\ -s[j]>-w[i]+w[j]-s[i],w[i]+s[i]>w[j]+s[j]\\ 当W-s[i]\le W'-s[j],W-s[j]\le W'-w[i]+w[j]-s[i]\\ W'-s[j]>W'-w[i]+w[j]-s[i],w[i]+s[i]>w[j]+s[j]\\ Ws[i]>Ws[j],Ws[j]>Ww[i]+w[j]s[i]Ws[i]>Ws[j],s[i]<s[j]W>Ww[i]+w[j]w[j]<0,Ws[i]>Ws[j],Ws[j]Ww[i]+w[j]s[i]Ws[i]>Ww[i]+w[j]s[i],w[j]<0,Ws[i]Ws[j],Ws[j]>Ww[i]+w[j]s[i]s[j]>w[i]+w[j]s[i],w[i]+s[i]>w[j]+s[j]Ws[i]Ws[j],Ws[j]Ww[i]+w[j]s[i]Ws[j]>Ww[i]+w[j]s[i],w[i]+s[i]>w[j]+s[j]
那如果我只知道 i < j , w [ i ] + s [ i ] > w [ j ] + s [ j ] iw[j]+s[j] i<j,w[i]+s[i]>w[j]+s[j] ,能不能推出来他需要调换呢?
若 W − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] , W ′ > W , ∴ W ′ − s [ j ] > W − s [ j ] 若 W − s [ j ] ≤ W ′ − w [ i ] + w [ j ] − s [ i ] , − s [ j ] > − w [ i ] + w [ j ] − s [ i ] , W ′ − s [ j ] > W ′ − w [ i ] + w [ j ] − s [ i ] 若W-s[j]>W'-w[i]+w[j]-s[i],W'>W,\therefore W'-s[j]>W-s[j]\\ 若W-s[j]\le W'-w[i]+w[j]-s[i],-s[j]>-w[i]+w[j]-s[i],W'-s[j]>W'-w[i]+w[j]-s[i] Ws[j]>Ww[i]+w[j]s[i],W>W,Ws[j]>Ws[j]Ws[j]Ww[i]+w[j]s[i],s[j]>w[i]+w[j]s[i],Ws[j]>Ww[i]+w[j]s[i]
所以我只需要按 w [ i ] + s [ i ] w[i]+s[i] w[i]+s[i] 排序即可
这真是十分的 Amazing 啊!

Code

#include
#include
#include
#include

using namespace std;

struct node
{
     
    int val,w;
    friend bool operator < (node _,node __){
     return _.val<__.val;}
}a[50005];

int n;

int main()
{
     
    cin>>n;
    for(int i=1;i<=n;i++)
    {
     
        int w,s;
        scanf("%d%d",&w,&s);
        a[i].val=w+s;
        a[i].w=w;
    }
    sort(a+1,a+n+1);
    int ans=-1e9;
    for(int i=1,sum=0;i<=n;i++)
    {
     
        int w=a[i].w,s=a[i].val-w;
        ans=max(ans,sum-s);
        sum+=w;
    }
    cout<<ans<<endl;
    return 0;
}

你可能感兴趣的:(c++,题解)