![请添加图片描述](https://img-blog.csdnimg.cn/f0155bd05b52436b86b11a2c949db941.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSnIOiBqiDmmI4=,size_20,color_FFFFFF,t_70,g_se,x_16)
- 题意:给出多个区间,要求这些区间上必须有所要求数量的点,问最少需要放置多少个点才能满足。
- 分析:贪心最大化,所以尽量把点放在该区间的末端,后面有可能重复用到;所以sort排序,按每个区间的末端大小进行排序;
ac代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int book[300010];
struct node
{
int x,y,t;
}l[300010];
int cmp(node a,node b)
{
return a.y<b.y;
}
int main()
{
int n,t,i,j,f,sum;
scanf("%d%d",&n,&t);
sum=0;
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&l[i].x,&l[i].y,&l[i].t);
}
sort(l+1,l+1+t,cmp);
for(i=1;i<=t;i++)
{
f=0;
for(j=l[i].x;j<=l[i].y;j++)
{
if(book[j])
f++;
}
if(f>=l[i].t)
continue;
for(j=l[i].y;j>=l[i].x;j--)
{
if(!book[j])
{
book[j]=1;
sum++;
f++;
if(f==l[i].t)
break;
}
}
}
printf("%d\n",sum);
}