動規遞推 最優時間表 sche

2022-05-21 03:28:33 字數 2000 閱讀 7549

最優時間表

sche.pas/cpp)

【問題描述】

一台精密儀器的工作時間為 n 個時間單位。與儀器工作時間同步進行若干儀器維修程式。一旦啟動維修程式,儀器必須進入維修程式。如果只有乙個維修程式啟動,則必須進入該維修程式。如果在同一時刻有多個維修程式,可任選進入其中的乙個維修程式。維修程式必須從頭開始,不能從中間插入。乙個維修程式從第s個時間單位開始,持續t個時間單位,則該維修程式在第s+t-1個時間單位結束。為了提高儀器使用率,希望安排盡可能少的維修時間。

程式設計任務:對於給定的維修程式時間表,程式設計計算最優時間表。

【輸入資料】

第 1 行有2 個正整數n和 k(1≤n,k≤9999)。n表示儀器的工作時間單位;k是維修程式數。接下來的k行中,每行有2 個表示維修程式的整數s和 t,該維修程式從第s個時間單位開始,持續t個時間單位。

【輸出資料】

最少維修時間。

【樣例輸入】sche.in

15 6

1 21 6

4 11

8 58 1

11 5

【樣例輸出】sche.out

這一題用搜尋應該能做,不過效率很低,當時沒做出來

用動規的話可以換一種思維求最大工作時間

正序列舉的話就會面臨題目中所說的只有乙個必須取,多個隨便取乙個,很不好判斷,所以可以逆序列舉

用f[i]表示 i~n 的最大工作時間,如果沒有以 i 為開頭的維修工作,那麼f[i]=f[i+1]+1(這裡的1是由於沒有維修任務,就盡可能的多工作,所以加乙個時間單位)

如果有,就從裡面選乙個最大值f[i]=max

最後輸出答案用n減去f[1]即可

還有一種方法就是直接推最短維修時間,不過要賦初值,其他改動的就是f[i]取min,最後輸出f[1]

#include#include#includeusing namespace std;

#define maxn 10010

#define oo 999999999

int n,k,f[maxn];

struct tnode;

tnode* first[maxn];

void insert(int s,int t)

int main()

memset(f,63,sizeof(f));

f[n+1]=n;

for(i=n;i>=1;i--)

tnode* node=first[i];

while(node)

}printf("%d",f[1]);

return 0;

}

動規遞推 Seq

description 由於hyf長得實在是太帥了,英俊瀟灑,風流倜儻,人見人愛,花見花開,車見車載。有一群mm排隊看hyf。每個mm都有自己獨特的風格,由於hyf有著一顆包容的心,所以,什麼風格的mm他都喜歡 但是,hyf有乙個特別的要求,他不希望總是看到風格得差不多的mm,更加特別的是,如果兩個...

動規遞推 聰明伶俐的香穗子

聰明伶俐的香穗子 香穗子遇到難題了.題目是這樣的,乙個序列上有n個整數,現在你要取m個,且這m個數的任意兩個不能相隔的太近,否則這樣會太醜,現在問你最大能得到多大的和 輸入 第一行三個數n,m,k,分別表示n個數,取m個,且m個中的任意兩個位置差要大於等於k 接下來一行,有n個整數,表示序列上的每個...

Employment Planning 動規小練

employment planning 原題鏈結 對於當前月份所需人數,和僱傭最大所需人數之間的情況進行討論。由於解雇金額和僱傭金額的存在,會存在一次性僱傭更多的人以減少解雇金額的情況,所以要討論到所需最大人數。include include include include include incl...