HDU - 4221

題目是英文題;一開始沒看懂,後來結束後翻譯,發現題目不難;

題意:

如果一項工作是完成後,他將得到一個懲罰比。
儘管他不可能在最後期限前完成每一項任務,但他希望所有任務的最大懲罰儘可能小。
他可以按任何順序完成這些任務,一旦任務開始,就不能中斷。
所有任務應在整數時間開始,時間從0開始。

如果一個工作在Di天之後,即Ti天完成,那麼懲罰是Ti-Di

解題:
大概思路就是遍歷每一個任務。 記錄當前花費時間 ,以及當前任務i的懲罰。稍微處理一下。
題意是要記錄最大的一次懲罰,而不是把所有懲罰相加…

貪心:
所有任務的最大懲罰儘可能小
策略:
將任務按結束時間從小到大排序,所求答案就是其中(Ti-Di)最大的那個。
假設時間t時刻,在未完成任務中取兩個兩個任務,
一個截止時間爲d1,另一個爲d2,
d1<d2,
若先選擇d1,
max(cnt+c2-d2,cnt+c2+c1-d1)=cnt+c2+c1-d1;
若先選擇d2,
max(cnt+c1-d1,cnt+c2+c1-d2)<cnt+c2+c1-d1;

#include<cstdio>
#include<iostream>
#include<iomanip>
#include<string.h>
#include<algorithm>
#define pi acos(-1.0)
#define MaxN  0x3f3f3f3f
#define MinN  0xc0c0c0c0
using namespace std;
typedef long long ll;
const int N=1e6+10;
struct node
{
    int x,y;
}s[N];
bool cmp(node a,node b)
{
    return a.y<b.y;
}
int main()
{
    int x,n,ans=1;
    ll cnt;
    cin>>x;
    while(x--)
    {
        scanf("%d",&n);
        for(int i=0; i<n; i++)
            scanf("%d%d",&s[i].x,&s[i].y);
        sort(s,s+n,cmp);
        cnt=0;
        ll w=0;
        for(int i=0; i<n; i++)
        {
            w+=s[i].x;
            if(w-s[i].y>cnt)
                cnt=w-s[i].y;
        }
        printf("Case %d: %lld\n",ans++,cnt);
    }
    return 0;
}

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