最優時間表
(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...