题目描述
给定若干区间,区间之间可能会有部分互相覆盖,也可能一个区间包含另一个区间。
再给定每个区间中要求选出的数字的数量,用(Li ,Ri ,Ci )表示要从[Li ,Ri]区间中选出至少Ci个整数。请问,如果要满足所有区间选数数量的要求,至少一共要选多少个数?
输入
第一行一个整数 N ,表示区间个数;
接下来N 行,每行三个整数(Li ,Ri ,Ci),含义如题所述。
输出
一个整数,表示最少要选出数字的数量。
样例
输入
4
4 5 1
6 10 3
7 10 3
5 6 1
输出
4
说明
【样例解释】
区间[4,5]中选择数字5;
区间[5,6]不需要再选,5已经被选中;
区间[6,10]中选择数字7,8,9或者数字8,9,10
区间[7,10]中由于上一个[6,10][6,10]中已经选择了7,8,9 或者 数字8,9,10因此不需要再选择;
一共选择了 4 个数。
【数据范围】
N≤1000,0≤Li≤Ri≤1000,1≤Ci≤Ri-Li+1。
#include<bits/stdc++.h>
using namespace std;
int n,ans;
struct node{
int l,r,c;
};
node a[1010];
bool f[1010];
bool cmp(node x,node y){
return x.r<y.r;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r>>a[i].c;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
int sum=0;
for(int j=a[i].l;j<=a[i].r;j++){
if(f[j]){
sum++;
}
}
if(sum>=a[i].c) continue;
for(int j=a[i].r;j>=a[i].l;j--){
if(f[j]) continue;
f[j]=true;
sum++;
ans++;
if(sum>=a[i].c) break;
}
}
cout<<ans;
return 0;
}