ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

种树

2022-08-15 01:31:04  阅读:170  来源: 互联网

标签:cnt area int book 种树 居民


题目描述

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有