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