1. 程式人生 > >POJ 3045 Cow Acrobats (最大化最小值)

POJ 3045 Cow Acrobats (最大化最小值)

amp 最小 space bool stdin using 自身 max pro

題目鏈接:click here~~

【題目大意】

給你n頭牛疊羅漢。每頭都有自己的重量w和力量s,承受的風險數rank就是該牛上面全部牛的總重量減去該牛自身的力量,題目要求設計一個方案使得全部牛裏面風險最大的要最小。

【解題思路】:依照w+s貪心放置,越大的(註意是w+s之和)越在以下。不難證明:假設最優放置時。相鄰兩頭牛屬性分別為w1,s1,w2,s2,第一頭牛在第二頭上面,sum為第一頭牛上面的牛的體重之和。那麽第一頭牛風險:rank1=sum-s1;第二頭牛風險:rank2=sum+w1-s2;交換兩頭牛位置之後 rank1‘=sum+w2-s1,rank2‘=sum-s2,因為是最優放置,所以w2-s1>=w1-s2。即w2+s2>=w1+s1,所以和最大的一定在最以下!因此排序。推斷就可以!

代碼:

//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e6+10;
long long  num[N];
long long  n,m,k;
struct node
{
    long long  sum ,w,s;
} pp[N];
bool cmp(node a,node b)
{
    return a.w+a.s<b.w+b.s;//坑啊!

!! } int main() { //freopen("1.txt","r",stdin); scanf("%lld",&n); for(int i=1; i<=n; i++) { scanf("%lld%lld",&pp[i].w,&pp[i].s); } sort(pp,pp+n+1,cmp); pp[1].sum=0; for(int i=2; i<=n; i++) { pp[i].sum=pp[i-1].sum+pp[i-1].w; } long long maxx=-1e10; for(int i=1; i<=n; i++) { maxx=max(pp[i].sum-pp[i].s,maxx); } printf("%lld\n",maxx); return 0; }



POJ 3045 Cow Acrobats (最大化最小值)