【問題】
現在我們國家開展新農村建設,農村的住房建設納入了統一規劃,統一建設,政府要求每一住戶門口種些樹。門口路邊的地區被分割成塊,並被編號成1…N。每個部分爲一個單位尺寸大小並最多可種一棵樹。每個居民房子門前被指定了三個號碼B,E,T。這三個數表示該居民想在B和E之間最少種T棵樹。當然,B≤E,居民必須記住在指定區不能種多於區域地塊數的樹,所以T≤E-B+l。居民們想種樹的各自區域可以交叉。你的任務是求出能滿足所有要求的最少的樹的數量,儘量較少政府的支出。
【輸入】
第一行包含數據N,M,區域的個數(0<N≤30000),房子的數目(0<m≤5000);
下面的m行描述居民們的需要:B E T,0<B≤E≤30000,T≤E-B+1。【輸出】
輸出一個數,爲滿足所有居民的要求,所需要種樹的最少數量。
【思路】
貪心
要想種樹種得少,就要使一棵樹給多個區間使用,儘量把樹向後面放(先把區間按照區間尾從小到大排序)。具體看代碼
【源代碼】
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 30000+5;
struct Node{
int st,ed;
int num;
bool operator < (const Node &b)const{//運算符重載,重載後sort不用寫cmp了
return ed < b.ed;
}
}a[N];
bool vis[N];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&a[i].st,&a[i].ed,&a[i].num);
sort(a+1,a+1+m);
int res=0;
for(int i=1;i<=m;i++){
int used=0;
for(int j=a[i].st;j<=a[i].ed;j++)
if(vis[j])
used++;
if(used<a[i].num){
for(int j=a[i].ed;j>=a[i].st;j--){
if(!vis[j]){
vis[j]=true;
used++;
res++;
if(used==a[i].num)
break;
}
}
}
}
printf("%d\n",res);
return 0;
}