區間排程問題。

2022-03-17 22:26:22 字數 1442 閱讀 5571

1,看起來就難裡難氣的。

2,關鍵是思想吧,在可選的工作中每次都選擇結束時間最早的工作。

3,對了還要再獨立寫一遍才算。

#include#include

using

namespace

std;

int n,s[1005],t[1005

];pair

itv[1005

];int ans=0,t=0

; int

main()

for(int i=0;is[i];}

sort(itv,itv+n);

//不過這個排序應該是以first為首,second跟著變

//所以就把結束時間早的給排到前面去了

for(int i=0;i)

}//設計的還是很巧妙的

cout}

4,記住是獨立得寫出來。

5,還有費曼一方面從巨集觀上費曼整個題目,一方面從微觀的角度費曼一些**細節。

6,經過我這裡的經驗,發現三遍也不一定好。

分三個階段

第一,借助各種方法實現了一遍(標誌是起碼已經通過樣例了(或者ac))

第二,開始單純寫**,表示是能夠獨立寫一遍之後,開始用腦子過一遍整個題目,然後再寫最後一遍。

第三,開始費曼,一方面費曼大的題目題意,一方面費曼小的**細節。

7,費大。簡化為乙個簡陋版的拼湊問題,因為一般的拼湊是恰好,這個不要求恰好,但是拼湊的時候你可以不足,但是不可以超過。

(也可以想象成不足可以用膠水什麼的粘上,但是為了盡量少用膠水,所以要盡量多的木板)

然後我們的解決方法就是每次在可選擇的中的木板中選

//不行,你這樣拼湊的話失去了人家固有的兩個屬性。

若干個具有兩個可以比較的屬性的事務,重點比較最後乙個屬性。在選擇中新增了個貪心嘛(以最後乙個屬性為決定因素)。

那怎麼來深化**細節?

一,明確該模組**的變數以及各表示式的意義。

二,對該模組進行改寫。

#include#include

#include

using

namespace

std;

const

int maxn=1005

;int

n,s[maxn],t[maxn];

pair

itv[maxn];

int ans=0,t=0

;int

main()

for(int i=0;is[i];}

sort(itv,itv+n);

for(int i=0;i)

}cout

}

7,改寫後的。

t=itv[0

].first;

ans=1

;

for(int i=1;i)

區間排程問題

有n項工作,每項工作分別在start i 時間開始,在end i 時間結束。對於每項工作,你都可以選擇參與與否,如果選擇參與,那麼自始至終必須全程參與。此外參與時間段不能重疊 即使是開始的瞬間與結束的瞬間重疊也是不允許的 那麼最多能參與多少項工作?演算法思想 在可選的工作中,每次都選取結束時間最早的...

區間排程問題

有n項工作,每項工作分別在start i 時間開始,在end i 時間結束。對於每項工作,你都可以選擇參與與否,如果選擇參與,那麼自始至終必須全程參與。此外參與時間段不能重疊 即使是開始的瞬間與結束的瞬間重疊也是不允許的 那麼最多能參與多少項工作?演算法思想 在可選的工作中,每次都選取結束時間最早的...

區間排程問題

我們要選擇結束時間最早的,這樣才能保證選的區間比較多,因此這個裡面會有對區間的排序,結束時間最早排在前面,運用了pair,pair中有兩個屬性就是first,second,把s存在了second中,把t存在了first中,這樣就可以把結束時間最早放在前面。include include includ...