题目描述
有一个整数序列,它的每个数各不相同,我们不知道它的长度是多少(即整数个数),但我们知道在某些区间中间至少有多少个整数,用区间(Li,Ri,Ci)来描述,表示这个整数序列中至少有Ci个数来自区间[Li,Ri],给出若干个这样的区间,问这个整数序列的长度最少能为多少?
输入格式
第一行一个整数N,表示区间个数;
接下来N行,每行三个整数(Li,Ri,Ci),描述一个区间。
【数据规模】
N<=1000,0<=Li<=Ri<=1000,1<=Ci<=Ri-Li+1
输出格式
仅一个数,表示该整数序列的最小长度。
输入输出样例
输入 #1
4
4 5 1
6 10 3
7 10 3
5 6 1
输出 #1
4
解法:贪心
- 我们先把所有区间按右端点从小到大排序,然后对于每个区间我们可以尽量把整数都放到后面,因为这样可以满足后面更多的需求,我们再开一个bool数组记录哪个地方放了整数
AC代码
#include<cstdio>
#include<algorithm>
#define re register int
using namespace std;
struct node {
int l,r,c;
}e[1010];
int n,ans; bool v[1010];
inline bool cmp(node A,node B) { return A.r<B.r; }
int main() {
scanf("%d",&n);
for(re i=1;i<=n;i++) {
scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].c);
}
sort(e+1,e+n+1,cmp);
for(re i=1;i<=n;i++) {
int tot=0;
for(re j=e[i].l;j<=e[i].r;j++) {
if(v[j]) tot++;
}
if(tot<e[i].c) {
for(re j=e[i].r;j>=e[i].l;j--) {
if(!v[j]) {
v[j]=1,tot++,ans++;
if(tot==e[i].c) break;
}
}
}
}
printf("%d",ans);
return 0;
}