題目是英文題;一開始沒看懂,後來結束後翻譯,發現題目不難;
題意:
如果一項工作是完成後,他將得到一個懲罰比。
儘管他不可能在最後期限前完成每一項任務,但他希望所有任務的最大懲罰儘可能小。
他可以按任何順序完成這些任務,一旦任務開始,就不能中斷。
所有任務應在整數時間開始,時間從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;
}