T1423 種樹(信息學奧賽一本通)(貪心)

【問題】

現在我們國家開展新農村建設,農村的住房建設納入了統一規劃,統一建設,政府要求每一住戶門口種些樹。門口路邊的地區被分割成塊,並被編號成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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章