1280 洛谷 尼克的任務

ACM_e發表於2017-10-07

題目描述

尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由一個開始時刻與一個持續時間構成。

尼克的一個工作日為N分鐘,從第一分鐘開始到第N分鐘結束。當尼克到達單位後他就開始幹活。如果在同一時刻有多個任務需要完戍,尼克可以任選其中的一個來做,而其餘的則由他的同事完成,反之如果只有一個任務,則該任務必需由尼克去完成,假如某些任務開始時刻尼克正在工作,則這些任務也由尼克的同事完成。如果某任務於第P分鐘開始,持續時間為T分鐘,則該任務將在第P+T-1分鐘結束。

寫一個程式計算尼克應該如何選取任務,才能獲得最大的空暇時間。

輸入輸出格式

輸入格式:

輸入資料第一行含兩個用空格隔開的整數N和K(1≤N≤10000,1≤K≤10000),N表示尼克的工作時間,單位為分鐘,K表示任務總數。

接下來共有K行,每一行有兩個用空格隔開的整數P和T,表示該任務從第P分鐘開始,持續時間為T分鐘,其中1≤P≤N,1≤P+T-1≤N。

輸出格式:

輸出檔案僅一行,包含一個整數,表示尼克可能獲得的最大空暇時間。

輸入輸出樣

輸入樣例#1:
15 6
1 2
1 6
4 11
8 5
8 1
11 5

輸出樣例#1:
4
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[1000001];
struct task{
   int st,la;
}a[100001];
bool cmp(struct task q,struct task w){
    return q.st<w.st;
}
int main(){
    int m,n;
      cin>>m>>n;
    for(int j=1;j<=n;j++){
        cin>>a[j].st>>a[j].la;
    }
    sort(a+1,a+n+1,cmp);
    for(int j=m;j>=1;j--){
        int x=1;
        for(int k=1;k<=n;k++){
            if(a[k].st==j){
                x=0;
                dp[j]=max(dp[j],dp[j+a[k].la]);
            }
        }
        if(x) dp[j]=dp[j+1]+1;
    }
    cout<<dp[1]<<endl;
}






相關文章