題目雖然是這麼寫
但我被卡了乙個多小時……
然而有很多小夥伴說:「我花了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...