題目描述:
給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 [ai, bi] 裡至少有 ci 個點
使用差分約束系統的解法解決這道題
使用差分約束系統的解法解決這道題
使用差分約束系統的解法解決這道題
使用差分約束系統的解法解決這道題
使用差分約束系統的解法解決這道題
輸入:輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 <= n <= 50000, 0 <= ai <= bi <= 50000 並且 1 <= ci <= bi - ai+1。
輸出:輸出乙個整數表示最少選取的點的個數
sample:
input:
53 7 3
8 10 3
6 8 1
1 3 1
10 11 1
output:
6題目分析:
這是乙個經典的差分約束問題(題目要求是這樣的),那麼我們就需要找不等式組,我們發現乙個「至少」,那樣我們就確定了:在乙個區間【a,b】中去sum【i】為【0-i】中選點的個數,有sum【b】-sum【a-1】≥c,這樣也就意味著區間內至少有c個點,於是我們就可以對每乙個輸入的點建立不等式,把不等式轉換為圖就可以解決了。
那麼我們先建立圖
struct edge
e[1000010];
int tot,head[
50010];
void
add(
int u,
int v,
int w)
然後我們要保證sum陣列是有意義的,那這個樣子就有約束條件0≤sum【i】-sum【i-1】≤1
for
(int i=
1;i<=maxx;i++
)
不過我們發現乙個問題,如果i從0開始,那樣會出現sum【-1】,但是並沒有這個點,所以我們插入邊的時候把點+1來平移一位,讓-1變為0
for
(int i=
0;i)
那這個樣子求最小解就是≥不等式最長路徑,為
cout<;
其餘的就是spfa了
queue<
int> q;
bool vis[
50010];
int dis[
50010];
for(
int i=
0;i<=maxx;i++
) q.
push(0
);vis[0]
=true
; dis[0]
=0;while
(!q.
empty()
)}}}
**如下:
#include
#include
using
namespace std;
struct edge
e[1000010];
int tot,head[
50010];
void
add(
int u,
int v,
int w)
intmain()
tot=0;
int maxx;
for(
int i=
0;i)for
(int i=
1;i<=maxx;i++
) queue<
int> q;
bool vis[
50010];
int dis[
50010];
for(
int i=
0;i<=maxx;i++
) q.
push(0
);vis[0]
=true
; dis[0]
=0;while
(!q.
empty()
)}}}
cout<;}
至於d題,實際上就是資料更複雜了,不過換乙個編譯器輕鬆搞定,同乙份**,a題g++17,d題vc++2017 第八周作業
1 理解窗體的檔案含義及組織結構 如 form1.cs form1.designer.cs form1.resx 控制項的屬性 方法和事件。2 完全用 的方式在form1.cs檔案中建立乙個文字標籤物件label1,用 設定label1的parent location name text autos...
第八周作業
1 顯示統計占用系統記憶體最多的程序,並排序 2 編寫指令碼,使用 for 和 while 分別實現 192.168.0.0 24 網段內,位址是否能夠 ping 通,若 ping 通則輸出 success 若 ping 不通則輸出 fail 3 每週的工作日 1 30,將 etc 備份至 back...
第八周作業
本週是團隊專案的最後一周,我們的團隊專案也完成了大部分的工作。下面是我們近兩周的工作內容,以及我在這個團隊專案中的總結與心得體會。我們小組所進行的專案是仿照手遊 球球大作戰 製作3d的pc版遊戲。到目前為止,我們已經完成了大部分文件與編碼工作,還差測試文件的成型 其它文件的細節修改與一些bug的修補...