【poj3045】牛的雜技

【問題描述】

  FJ養了N頭牛,他們按照1到N依次編上了號。FJ所不知道的是,他的所有牛的夢想是從農場逃走,去參加馬戲團的演出。可奶牛門很快發現他們那麼笨拙的蹄子根本無法在鋼絲或晃動的鞦韆上站穩(他們還嘗試過把自己裝在大炮裏發射出去,但可想而知,結果是悲慘的)。最終,他們決定練習一種最簡單的雜技:把所有牛都摞在一起,比如說,第一頭牛站在第二頭牛的身上,同時第二頭牛有站在第三頭牛的身上……,最底下的是第N頭牛(牛果然沒什麼創造力)。

  每頭牛都有自己的體重以及力量,編號爲i的牛的體重爲Wi,力量爲Si。當某頭牛身上站着另一些牛時它會在一定程度上被壓扁,我們不妨把它被壓扁的程度叫着壓扁指數。對於任意的牛,它的壓扁指數等於摞在它上面所有牛的總重量(當然不包括自己)減去它的力量。奶牛們按照一定的順序摞在一起後,他們的總壓扁指數就是被壓得最扁的那頭牛的壓扁指數。你的任務就是幫助奶牛們找出一個摞在一起的順序,使得總壓扁指數最小。

【輸入格式】

  第 1 行:一個單獨的正整數N。
  第 2到第 N+1 行:第 i+1 行給出編號爲i的奶牛的體重於力量 Wi 和 Si ,用一個空格分開。

【輸出格式】

  一個整數,表示奶牛門總壓扁指數的最小值。

【輸入樣例】

3
10 3
2 5
3 3

【輸出樣例】

2

【樣例解釋】

把重量爲10的那頭牛放在最底下,於是她的壓扁指數就是2+3-3=2。其他2頭牛的壓扁指數都小於這個值。

【數據範圍】

1<=N<=50 000  1<=Wi<=10 000 1<=Si<=1 000 000 000

考試第三題,終於覺得有點感覺了,“考察的物品有多種屬性,而且規模很大”,Mr.He講稿上的話迴響在腦殼裏面,這個很明顯的貪心啊,而且是那種考慮前後選擇順序的貪心。讀完題就拿起畫圖分析,果然排序還是好想;
設aij爲先選擇第i頭奶牛,後選擇第j頭牛的壓力指數
aji爲先選擇第j頭奶牛,後選擇第i頭牛的壓力指數
由於整個奶牛隊列的總壓扁指數是各頭牛壓扁指數的最大值,再設選擇i,j之前,i,j上方的奶牛總重爲sum則
aij=max(sum-a[i].s,sum+a[i].w-a[j].s);
aji=max(sum-a[j].s,sum+a[j].w-a[i].s);
max中兩項同時消去sum;
aij=max(-a[i].s,a[i].w-a[j].s);
aji=max(-a[j].s,a[j].w-a[i].s);
故比較函數

bool cmp(data a,data b)//比較函數,把體重大,力量大的牛放在下面 
{
    int aij=max(-a.s,a.w-b.s);
    int aji=max(-b.s,b.w-a.s);
    return aij<aji;
}

當時排序完了覺得sum-a[n].s就是答案,但是這樣想是有問題的,因爲這樣排序是使得每一頭奶牛的壓力指數最小,並不是整個隊列的壓力指數,整個隊列的壓力指數還要在這些算出的最小指數中取最大值。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#define maxn 50005
#define inf 1000000010
using namespace std;
int n;
struct data
{
    int w,s;
}A[maxn];

bool cmp(data a,data b)//比較函數,把體重大,力量大的牛放在下面 
{
    int aij=max(-a.s,a.w-b.s);
    int aji=max(-b.s,b.w-a.s);
    return aij<aji;
}

int main()
{
    //freopen("my.in","r",stdin);
    //freopen("my.out","w",stdout);

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d%d",&A[i].w,&A[i].s);

    sort(A+1,A+n+1,cmp);

    int maxp=-inf,sum=0;
    for(int i=1;i<=n;i++)//順序查找最大的壓力指數(不要認爲ans=sum-A[n].s;) 
    {
        maxp=max(maxp,sum-A[i].s);
        sum+=A[i].w;
    }
    printf("%d",maxp);

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章