其他分享
首页 > 其他分享> > 种树

种树

作者:互联网

题目描述

一条街的一边有几座房子。因为环保原因居民想要在路边种些树。路边的地区被分割成块,并被编号成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

输出样例 

5

数据范围与提示

数据规模:
30%的数据满足 0<n<=1000;0<h<=500;
100%的数据满足 n<=30000;h<=5000;
#include<iostream>
#include<algorithm>
using namespace std;
int book[30001]={}; // 假设所有区域都没有种树,用0进行标记。 

struct area{
    int s,e,m; // s:开始种树位置;e: 结束种树的位置;m: 种树的数量。 
}a[5001];

bool cmp(area x, area y){
    return x.e < y.e;
}

int main(){
    int n,h,cnt,sum=0;
    cin>>n>>h; 
    for(int i=1; i<=h; i++)
        cin>>a[i].s>>a[i].e>>a[i].m;
    // 根据种树的结束位置进行升序排序。
    sort(a+1, a+h+1, cmp); 
    for(int i=1; i<=h; i++){
        cnt=0; //  
        for(int j=a[i].s; j<=a[i].e; j++){
            if(book[j]==1) cnt++;
        } 
        for(int k=a[i].e; k>=a[i].s; k--){
            if(cnt>=a[i].m) break;
            if(book[k]==0) {
                book[k]=1;
                sum++;
                cnt++;
            }
        }
    }
    cout<<sum;
    return 0;
}

 

标签:cnt,area,int,book,种树,居民
来源: https://www.cnblogs.com/dks0313/p/16586863.html