1. 程式人生 > >貪心算法訓練(五)——種樹

貪心算法訓練(五)——種樹

判斷 大小 開始 include mark font 問題 str -s

1. 問題描述

  一條街道的一邊有幾座房子,因為環保原因居民想要在路邊種些樹,路邊的地區被分割成 n 塊,並被編號為 1…n,每塊大小為一個單位尺寸並最多可以種一棵樹,每個居民想在門前種些樹並指定了三個數 b,e,t 這三個數分別表示該居民想在 b 和 e 之間最少種 t 棵樹,當然,b<=e,t<=e-b+1 ,允許居民想種樹的子區域可以交叉。出於資金緊缺的原因,環保部門請你求出能滿足所有居民的種樹要求時所需樹的最少數量

2.輸入格式

  第一行為 n,表示區域的個數

  第二行為 h,表示房子的數目

  下面 h 行描述居民的需要:b,e,t (0 < b <= e <= 30000,t <= e-b+1)分別用空格分開

3. 輸出格式

  輸出一個數,為滿足所有居民的要求,所需要種樹的最少數量

4. 樣例輸入

  9

  4

  1 4 2

  4 6 2

  8 9 2  

  3 5 2

5, 樣例輸出

  5

6. 思路分析

  按區間的末尾進行排序,從頭開始,將區間的末尾加入隊列,判斷它是否存在於下個區間,如果存在,繼續判斷下一個區間,如果不存在,取下一個區間的末尾,繼續判斷,得到可以存在於公共位置的區間個數,就是可以節約的樹的數量

7. 代碼

#include <iostream>
#include <cstring>
#include 
<algorithm> using namespace std; void insertion_sort(int a[],int arr[],int len); int main() { ios::sync_with_stdio(false); int n,h,num = 0,sum = 0; int i = 0; cin>>n>>h; int start[h],end[h],tree[h]; for(; i < h; i++) cin>>start[i]>>end[i]>>tree[i]; insertion_sort(start,end,h);
int mark = end[0]; for(i = 0;i<h;i++) { sum += tree[i]; if(mark >= start[i]) num++; else mark = end[i]; } cout<<sum - num; return 0; } void insertion_sort(int a[],int arr[],int len) { for(int i=1; i<len; i++) { int key=arr[i];int j; for(j=i-1; j>=0 && key<arr[j]; j--) { arr[j+1]=arr[j]; a[j+1] = a[j]; } arr[j+1]=key; } }

貪心算法訓練(五)——種樹