先看貪心版本。
每次種的樹在重疊區間越多,種的樹越少。只有結束位置才會重合,就對區間結束的位置從小到大排序。
然後遍歷每個區間統計第i個區間種了k個樹,若k大於 t ,則continue, 否則從區間末尾往前種樹。
//貪心種樹
#include using namespace std;
struct n
} }printf("%d\n",ans);
return 0;
}
差分約束
題目中有這麼幾個約束條件
sum[i]是 i 的字首和。
從u到v: sum[u-1] - sum[v] <= - t
從i-1到i: sum[i] - sum[i-1] <=1
從i到i-1: sum[i-1] - sum[ i ]<=0
最後找乙個源點也即n+1,n+1到每個點距離為0 sum[i] - sum[n+1]=0
//差分種樹
#include using namespace std;
#define inf 0x7fffffff
#define r register
struct n;
int cnt,n,m;
int s;
n edge[100005];
int head[100005],dis[30005],book[30005];
int read()
while(c>='0'&&c<='9')
return x*dign;
}void add(int u,int v,int w)
void spfa()
} } }
}int main()
for(r int i=1;i<=n;i++)
for(r int i=0;i<=n;i++)add(n+1,i,0);
s = n+1;
spfa();
int mi = inf;
for(int i=0;i<=n;i++)mi = min(mi,dis[i]);
printf("%d\n",dis[n]-mi);
return 0;
}
種樹(差分約束)
種樹 來自 luogu 1250 題目概述 一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1.n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b e,居民...
差分約束 種樹
題目鏈結 一條街的一邊有幾座房子,因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成 1,2,n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民都想在門前種些樹,並指定了三個號碼 b,e,t。這三個數表示該居民想在地區 b 和 e 之間 包括 b 和 e 種至少 t 棵樹。居民...
種樹(一道簡單的差分約束系統)
為了綠化鄉村,h村積極響應號召,開始種樹了。h村里有n幢房屋,這些屋子的排列順序很有特點,在一條直線上。於是方便起見,我們給它們標上1 n。樹就種在房子前面的空地上。同時,村民們向村長提出了m個意見,每個意見都是按如下格式 希望第li個房子到第ri個房子的房前至少有ci棵樹。因為每個房屋前的空地面積...