*【貪心】種樹**
【貪心】種樹
一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成1…N。每個部分為一個單位尺寸大小並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼B,E,T。這三個數表示該居民想在B和E之間最少種T棵樹。當然,B≤E,居民必須記住在指定區不能種多於區域地塊數的樹,所以T≤E-B+l。居民們想種樹的各自區域可以交叉。你的任務是求出能滿足所有要求的最少的樹的數量。
寫一個程式計算最少要種樹的數量。
輸入第一行包含資料N,區域的個數(0<N≤30000);
第二行包含H,房子的數目(0<H≤5000);
下面的H行描述居民們的需要:B E T,0<B≤E≤30000,T≤E-B+1。
輸出樹的數目。
樣例輸入複製樣例資料
9
4
1 4 2
4 6 2
8 9 2
3 5 2
樣例輸出
因為輸出的是最少 所以當有重合的地方種樹
所以將有重合的區間進行剪掉即使答案;
程式碼如下
#include
#include
using namespace std;
struct number{
int start;
int end;
int t;
}num[50];//定義結構體 使用 陣列和排序過題容易超時;
int comp(const number &a, const number &b){
return a.start <b.start ;
}//以第一個數排序其他跟著排序
int main()
{
int N,H,k;
while(scanf("%d",&N)!=EOF){
scanf("%d",&H);
for(int i=0;i<H;i++)
scanf("%d%d%d",&num[i].start,&num[i].end,&num[i].t);
sort(num,num+H,comp);
for(int i=0;i<H;i++){
for(int j=i+1;j<H;j++){
if(num[i].end>=num[j].start)
num[j].t-=1;
}
}
int sum=0;
for(int i=0;i<H;i++)
sum+=num[i].t;
printf("%d\n",sum);
}
return 0;
}