區間選點 II Week8作業A題

2021-10-07 23:04:21 字數 1168 閱讀 3011

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 [ai, bi] 裡至少有 ci 個點

使用差分約束系統的解法解決這道題

輸入:輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 <= n <= 50000, 0 <= ai <= bi <= 50000 並且 1 <= ci <= bi - ai+1。

輸出:輸出乙個整數表示最少選取的點的個數

樣例:input:

5

3 7 3

8 10 3

6 8 1

1 3 1

10 11 1

output:

6
設:dis[i]表示數軸上 [0, i] 之間選點的個數

對於第 i 個區間 [xi,yi] 需要滿足 dis[yi]-dis[xi-1]>=ci

同時,應保證dis是有意義的,即:0≤dis[i]-dis[i-1]≤1

求該差分約束系統的最小解,轉化為 ≥ 不等式組用spfa求最長路,答案為dis[max]

存在不等式0<=sum[0]-sum[-1]<=1,所以將區間整體右移乙個單位.

#include

#include

#include

using

namespace std;

int n,m,tot,dis[

50010

],sum[

50010

],head[

50010

],big_b;

bool flag[

50010*5

];queue<

int> q;

struct node

e[50010*5

];void

add_edge

(int u,

int v,

int w)

void

spfa()

}}}}

intmain()

for(

int i=

1;i<=big_b;i++

)spfa()

; cout<;return0;

}

Week8作業 A 區間選點II

問題描述 給定乙個數軸上的n個區間,要求在數軸上選取最少的點使得第i個區間 ai,bi 裡至少有ci個點。1 n 50000,0 ai bi 50000,1 ci bi ai 1。差分約束系統求解 結論 1.如果要求取最小值,則求最長路,將不等式全部化成xi xj k的形式,這樣建立j i的邊,權值...

Week 8 作業A 區間選點II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點。輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 50000 並且 1 ci bi ai 1...

Week8 作業 A 區間選點 II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 input 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai b...