Week 8 作業A 區間選點II

2021-10-23 06:14:45 字數 1663 閱讀 5134

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

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

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

537

38103

6811

311011

1

6
差分約束系統是用來解決一種特殊的n元一次不等式組,它包含n個變數與m個約束條件。

每個約束條件是兩個變數的差構成的,如xi-xj<=ck,其中ck為常數。

我們是要求出一組解,x1=a1,x2=a2……x3=a3使得所有約束條件得以滿足。

對於系統中任一不等式xi-xj<=ck,可轉化為xi<=xj+ck,假設xj為0,則我們需要在多個不等式中找到最小的ck來限制xi的條件,即我們需要在多個xi<=xj+c中找到最小的c,因此這裡可以把xi,xj想象成圖中的點,ck為邊權,我們需要找到所有點對於某一基準點的最短路徑,這樣就把差分模型轉化為最短路模型。

同理對於xi-xj>=ck的模型可以採用最長路模型來解決。

設sum[x]為x點在[0,x]區間內選的點數,對於每個區間[a,b]內選c個點,則有sum[a]-sum[b-1]>=c,為了使sum有意義,對於每個數i,存在0<=sum[i+1]-sum[i]<=1;

因為這裡是從0開始計算區間的,所以存在不等式0<=sum[0]-sum[-1]<=1,即圖中存在-1點,所以我們可以把區間整體右移乙個單位,使得圖中不存在-1點便於陣列處理。接下來使用差分模型即可。

因為-1點必然不取,即sum[-1]=0,故使用-1作為基準點,求得最長路,最終輸出所有區間最右端點max的sum[max]即可。

#include

#include

#include

using

namespace std;

const

int inf=

1e9;

const

int n=

50000+10

;const

int size=

1000000+10

;struct edgee[size]

;int head[n]

,tot;

void

add(

int v,

int t,

int w)

int max,vis[n]

,dis[n]

;void

spfa

(int s)}}

}}intmain

(int argc,

char

** ar**)

for(

int i=

1;i<=max;i++

)add

(i-1

,i,0),

add(i,i-1,

-1);

spfa(0

);printf

("%d"

,dis[max]);

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的邊,權值...

Week8 作業 A 區間選點 II

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

程式設計思維 week8 作業A 區間選點 II

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