《挑戰程式設計競賽(三)》簡單的區間排程問題

2021-09-19 14:53:28 字數 1342 閱讀 7613

題目雖然是這麼寫

但我被卡了乙個多小時……

然而有很多小夥伴說:「我花了10分鐘就寫出來了呀」

(淚)其實此題就是考察……德摩根律

先回顧一下題目:

有n項工作,每項工作分別在sisi時間開始,在titi時間結束。對於每項工作,你都可以選擇參與與否。如果選擇了參與,那麼自始至終都必須全程參與。此外,參與工作的時間段不能重疊(閉區間)。你的目標是參與盡可能多的工作,那麼最多能參與多少項工作?其中1⩽n⩽1000001⩽n⩽100000並且1⩽si⩽ti⩽1091⩽si⩽ti⩽109。(from《挑戰程式設計競賽 p40》) 

輸入樣例:1 2 4 6 8

3 5 7 9 10

輸出樣例:

3

也就是要求「不重合的最大覆蓋」

這話怪變扭的

其實就是

我們假設時間是一條線

有5份工作

他們什麼時候開始、什麼時候結束,分別儲存在兩個陣列中(s、t)

不妨把每份工作也看作一條條線

要他們互不侵犯——也就是線不能覆蓋線啦

如果嚴格來講得的話

就是,假設任取兩條線line1、line2

line1的起始點為s1,終結點為t1

line2的起始點為s2,終結點為t2

那麼,如果重合,就要分四種情況,這太不友好啦(我一開始就是這麼寫的……結果就卡在判斷上了)

眾所周知,計算機擅長二元問題……

所以,正著求弄不出來,就求補集嘛

**如下

#include

"iostream"

#include

"algorithm"

using namespace std;

const

int max_n =

100000

;int n =

5, s[max_n]

, t[max_n]

;int i;

pair<

int,

int> itv[max_n]

;void

solve()

for(i=

1;i <= n;i++

)for

(int i =

1; i <= n; i++

)sort

(itv, itv + n)

;int ans =

0, t =0;

for(

int i =

1; i <= n; i++)}

cout << ans << endl;

}int

main()

《挑戰程式設計競賽》閱讀筆記三

alds1 3 a stack 題目 我就不發了 這是 我抄書的,自己嘗試用stack寫,然後忘了stack怎麼用了 zzz include include include int top,s 105 void push int x int pop int toint char s return r...

poj1328 區間貪心 《挑戰程式設計競賽》

2018 1 31 其實就是貪心,每次將所選的點盡可能的向右,那麼我們所需的就會盡可能的少了。include include include define min 1e 5 using namespace std const int n 1000 struct zbs n 1 int n,r 計算出...

挑戰程式設計競賽 1 6節 三角形

問題主題 三角形 問題描述 有n根棍子,棍子i的長度為ai,想要從中選出三根棍子組成周長盡可能長的三角形。請輸出最大的周長,若無法組成三角形則輸出0。樣例 輸入n 5 a 輸出 12 選擇3,4,5時 輸入n 4 a 輸出 0 無法構成三角形 1 include 2 include 3 includ...