洛谷P1250 種樹 解題報告

2021-08-28 11:37:21 字數 1511 閱讀 9605

一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1…n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b≤e,居民必須記住在指定區不能種多於區域地塊數的樹,所以t≤e-b+l。居民們想種樹的各自區域可以交叉。你的任務是求出能滿足所有要求的最少的樹的數量。

寫乙個程式完成以下工作:

輸入格式:

第一行包含資料n,區域的個數(0第二行包含h,房子的數目(0下面的h行描述居民們的需要:b e t,0輸出格式:

輸出檔案只有一行寫有樹的數目

input

9

41 4 2

4 6 2

8 9 2

3 5 2

output
思路:

差分約束!!!!!!

不難發現 :

[l, r]至少要種t棵樹 可以轉換為sum® - sum(l-1) >= t

(sum_i是字首和,即從1到i有多少棵樹)

sum(i) - sum(i-1) <= 1

sum(i-1) - sum(i) <= 0

1是從題目中所給資訊得出的,而2是常識很多差分約束系統中一般都要加上的。

所以,即按照上面的資訊建邊,因為題目保證有解,所以放心地跑最短路就好啦!

#include

using

namespace std;

const

int maxn =

30005

,inf=

1e9;

int n,h;

struct edge

e[maxn<<2]

;int head[maxn]

,cnt,vis[maxn]

,d[maxn]

;inline

void

add(

int u,

int v,

int w)

queue<

int> q;

inline

void

spfa

(int s)}}

}}intmain()

for(

int i=

1;i<=n;i++

)int min=inf;

spfa

(s);

for(

int i=

0;i<=n;i++

) min=

min(min,d[i]);

printf

("%d\n"

,d[n]

-min)

;return0;

}

可能你也會有和我相同的疑惑:什麼時候跑最長路,什麼時候跑最短路(可能是我太菜了)。經過我的一番摸♂索,發現如果你連的邊的意義是起始點加上邊權小於等於到達點,那麼就是跑最短路,反之,跑最長路。(可能是這樣吧)。

洛谷 P1250 種樹 貪心

一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1.n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b e,居民必須記住在指定區不能種多於區域地塊數的樹,所...

洛谷P1250種樹(貪心)

一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1.n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b e,居民必須記住在指定區不能種多於區域地塊數的樹,所...

20190709種樹(洛谷P1250)

題目描述 一條街道的一邊有幾座房子,因為環保原因居民想要在路邊種些樹,路邊的居民被分割成 n 塊,並被編號為 1 n。每塊大小為乙個單位尺寸並最多可種一棵樹。每個居民想在門前種些樹並指定了三個數b,e,t。這三個數分別表示該居民想在b和e之間最少種t棵樹,當然b e,t e b 1,允許居民想種樹的...