1. 程式人生 > 其它 >洛谷P1280 尼克的任務 題解

洛谷P1280 尼克的任務 題解

技術標籤:人工智慧網路比特幣大資料專案管理

尼克的任務 - 洛谷

description:

k 個任務,每個任務有起始時間 p 和完成所需時間 t ,共有 n 個單位時間,如果一個任務開始時你不在做其他任務,那就必須接收這個任務。求最大的閒暇時間。

solution:

考慮到總時間

n\le 10^4 ,並不是很大,所以可以設 f_i 表示 i\sim n 的時間中最大的閒暇時間,這樣列舉 n 的時候不會超時。

注意這裡因為

f_i 的轉移需要使用到 f_{i+a_k} ,即做某一個任務延續後的時間。所以必須倒著處理。

然後就分類討論即可。當前無任務則直接

f_i=f_{i+1}+1 ,否則列舉每一個任務,找到閒暇時間最大的進行轉移。


時間複雜度約為

\Theta(n+k)

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; }