洛谷P1280 尼克的任務 題解
阿新 • • 發佈:2021-01-08
尼克的任務 - 洛谷
description:
個任務,每個任務有起始時間 和完成所需時間 ,共有 個單位時間,如果一個任務開始時你不在做其他任務,那就必須接收這個任務。求最大的閒暇時間。solution:
考慮到總時間
,並不是很大,所以可以設 表示 的時間中最大的閒暇時間,這樣列舉 的時候不會超時。注意這裡因為
的轉移需要使用到 ,即做某一個任務延續後的時間。所以必須倒著處理。然後就分類討論即可。當前無任務則直接
,否則列舉每一個任務,找到閒暇時間最大的進行轉移。時間複雜度約為
?code:
#include<cstdio>
#include<algorithm>
using namespace std;
int cnt[10005];
struct ben
{
int p,t;
}a[10005];
int cmp(const ben &a,const ben &b)
{
if(a.p==b.p)return a.t>b.t;
return a.p>b.p;
}
int f[10005];
int main()
{
int n,k;
scanf("%d%d",&n, &k);
for(int i=1;i<=k;i++)
{
scanf("%d%d",&a[i].p,&a[i].t);
cnt[a[i].p]++;
}
sort(a+1,a+k+1,cmp);
int tmp=1;
for(int i=n;i>=1;i--)
{
if(cnt[i]==0)
{
f[i]=f[i+1]+1;
}
else
{
for(int j=1;j<=cnt[i];j++)
{
if(f[i]<f[i+a[tmp].t])
{
f [i]=f[i+a[tmp].t];
}
tmp++;
}
}
}
printf("%d\n",f[1]);
return 0;
}