一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1…n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b≤e,居民必須記住在指定區不能種多於區域地塊數的樹,所以t≤e-b+l。居民們想種樹的各自區域可以交叉。你的任務是求出能滿足所有要求的最少的樹的數量。
寫乙個程式完成以下工作:
輸入格式:
第一行包含資料n,區域的個數(0第二行包含h,房子的數目(0下面的h行描述居民們的需要:b e t,0輸出格式:
輸出檔案只有一行寫有樹的數目
input
9output思路:41 4 2
4 6 2
8 9 2
3 5 2
差分約束!!!!!!
不難發現 :
[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,允許居民想種樹的...