尼克每天上班之前都連線上英特網,接收他的上司發來的郵件,這些郵件包含了尼克主管的部門當天要完成的全部任務,每個任務由乙個開始時刻與乙個持續時間構成。
尼克的乙個工作日為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 61280 尼克的任務1 21 6
4 11
8 58 1
11 5
1.子任務 第i時刻尼克是否有任務可選 如果有,選哪個歇的時間更長
2.定義狀態
在前i時刻尼克最多歇多久(最少工作多久)?
3.狀態轉移
本題要倒著推 及從大的時間往小的時間轉移 因為 如果正著 在i的時候 顯然還沒轉移 i+t
考慮如果 i時刻沒有任務 則 從i+1秒 到第 i 秒可以歇著 就爽歪歪。
如果有任務 就 從這幾個任務中 選擇乙個(根據程式選擇輕鬆地,就美滋滋!)
及 dp【i】=dp【i+1】+1;
或 if t【j】。s==i
dp【i】=max(dp【i+t【j】。e】,dp【i】);
具體看**吧!
對了在解釋乙個問題 sort對於這題而言 如果你要 每次花j的複雜度掃下的話 拍不排序無所謂 ,但是排序後 你可以根據時間的單調性優化,
及每次並不用掃完 就可以用特判結束
不排序 複雜度(確界) nk
排序 (上界)nk +(下界)klogk 上界 (k^2) (排序只討論sort)
#include
#include
#include
#include
#include
#include
using
namespace
std;
struct
node
t[10000];
int dp[10000];
int st[100009];
intcmp
(node a,node b)
int n,m,k;
intmain
()sort(t+1,t+1+n,cmp);
dp[n+1]=0;
for(int i=n;i>=1;i--)
else
}}cout
<1]
0;}
輸出樣例#1:
複製
4
動態規劃(3)
robberies include include include includeusing namespace std 這題是參考的 自己的能力還是不可以。不過做了這題,再和0 1揹包問題想一想,覺得收穫還是不錯。說將逃跑率當成物品價值 小弟還是要繼續消化這條題的思想。double f 10020...
3動態規劃
此次專題主要講解動態規劃,題目大致分為兩類 一種是遞迴來解決,一種是0 1揹包問題。動態規劃就是把乙個問題分成多個階段來解決,並且每個階段都相互有所聯絡。其遵循最優性原理。1,不論初始狀態和第一步決策是什麼,餘下的決策相對於前一次決策所產生的新狀態,構成乙個最優決策序列。2,最優決策序列的子串行,一...
ITA 動態規劃3
動態規劃,雙調歐幾里得旅行商問題 旅行商問題描述 平面上n個點,確定一條連線各點的最短閉合旅程。這個解的一般形式為np的 在多項式時間內可以求出 bentley 建議通過只考慮雙調旅程 bitonictour 來簡化問題,這種旅程即為從最左點開始,嚴格地從左到右直至最右點,然後嚴格地從右到左直至出發...