区间选数

题目描述
给定若干区间,区间之间可能会有部分互相覆盖,也可能一个区间包含另一个区间。

再给定每个区间中要求选出的数字的数量,用(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;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值