P1645 序列
题目描述
有一个整数序列,它的每个数各不相同,我们不知道它的长度是多少(即整数个数),但我们知道在某些区间中间至少有多少个整数,用区间( L i , R i , C i L_i,R_i,C_i Li,Ri,Ci)来描述,表示这个整数序列中至少有 C i C_i Ci 个数来自区间 [ L i , R i ] [L_i,R_i] [Li,Ri],给出若干个这样的区间,问这个整数序列的长度最少能为多少?
输入格式
第一行一个整数 N N N,表示区间个数;
接下来 N N N 行,每行三个整数 L i , R i , C i L_i,R_i,C_i Li,Ri,Ci,描述一个区间。
输出格式
仅一个数,表示该整数序列的最小长度。
输入输出样例 #1
输入 #1
4
4 5 1
6 10 3
7 10 3
5 6 1
输出 #1
4
说明/提示
数据范围及约定
对于全部数据, 1 ≤ N ≤ 1000 1\le N \le 1000 1≤N≤1000, 0 ≤ L i ≤ R i ≤ 1000 0 \le L_i \le R_i \le 1000 0≤Li≤Ri≤1000, 1 ≤ C i ≤ R i − L i + 1 1 \le C_i \le R_i-L_i+1 1≤Ci≤Ri−Li+1。
C++实现
#include
#include
#include
#include
using namespace std;
int n,m,vis[30005],ans;
struct node
{
int l,r,c;
}a[30005];
int cmp(node a,node b)
{
return a.r<b.r;
}
int main()
{
scanf(“%d”,&m);
for(int i=1;i<=m;i++)
{
scanf(“%d%d%d”,&a[i].l,&a[i].r,&a[i].c);
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++)
{
int cnt=0;
for(int j=a[i].l;j<=a[i].r;j++)
{
if(vis[j])
cnt++;
}
if(cnt<a[i].c)
{
for(int j=a[i].r;j>=a[i].l;j–)
{
if(!vis[j])
{
cnt++;
ans++;
vis[j]=1;
if(cnt==a[i].c)
break;
}
}
}
}
cout<<ans;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容