[poj3041] Cow Acrobats ( W+S的數學證明 )
阿新 • • 發佈:2018-12-16
/* poj3041 Cow Acrobats BY zhuhua Time Limit: 1000MS AC Time: 172MS 已經放的有sum 方案1:b上a下 Risk1(a)=sum+Wb-Sa Risk1(b)=sum-Sb 方案2:a上b下 Risk2(a)=sum-Sa Risk2(b)=sum+Wa-Sb 假設方案1更優秀,那麼max(Risk1(a),Risk(b))<max(Risk2(a),Risk2(b)) 然而已有Risk2(a)<Risk1(a), 所以max(Risk2(a),Risk2(b))只可能是Risk2(b) (如果max(Risk2(a),Risk2(b)=Risk2(a)的話max2<max1那麼方案2變得優秀了) (注意此時優秀的方案中上下風險大小未知) 可以得到兩個方程 (1)Risk2(b)>Risk1(a) (2)Risk2(b)>Risk1(b) 即 (1)sum+Wa-Sb>sum+Wb-Sa (2)sum+Wa-Sb>sum-Sb(顯然) 最後我們把原來的不等式劃到有效的只剩(1) (1)就是神祕的Wa+Sa>Wb+Sb b上a下 Wb+Sb<Wa+Sa 按照W+S從小到大排序但是注意優秀的方案內的上下風險大小不一定,所以還要掃一遍。 網上題解渣的一批看了很久才搞懂。 */ #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const int nmax=50050; struct COW{ll w,s;}; bool cmp(COW X ,COW Y){ return X.w+X.s<Y.w+Y.s; } int N; COW cow[nmax]; int main(){ scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%I64d%I64d",&cow[i].w,&cow[i].s); sort(cow+1,cow+1+N,cmp); ll sum=0,maxf=-1e9+11; for(int i=1;i<=N;i++){ maxf=max(maxf,sum-cow[i].s); sum+=cow[i].w; } cout<<maxf<<endl; return 0; }