第八周作業 AD

2021-10-04 23:31:04 字數 2151 閱讀 5023

題目描述:

給定乙個數軸上的 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的修補...