-
一本通蓝书模板题
闲聊
- 2022年的第一篇题解
- 啊,一个多月没新做编程题,考完期末感觉贪心什么的都要忘没了
(好吧不可能)。 - 但是——我又回来啦(请自行脑补灰太狼语调)
即使还有一大堆作业没写完。
思路
- 先按照结束位置进行排序,把结束早的放在前面;
- 把第一个区域从后面种够数量,然后处理剩下的。
- 这里有两种情况: 1. 因为有部分重合之前种的,数量已经达标:continue,处理下一个。2. 数量还不够:从这个区域的最后开始种。
代码
#include<bits/stdc++.h>
using namespace std;
struct cyy{
int b,e,t;
}a[5010];
bool f[30010];
bool cmp(cyy x,cyy y){return x.e<y.e;}
int main()
{
int n,m,ans=0;
memset(f,0,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&a[i].b,&a[i].e,&a[i].t);
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
int k=0;
for(int j=a[i].b;j<=a[i].e;j++)
if(f[j]) k++;//已经种过的树,累加
if(k>=a[i].t) continue; //数量达标,下一个
for(int j=a[i].e;j>=a[i].b;j--)
if(!f[j]){//补种(从尾部开始)
f[j]=1,k++,ans++;
if(k==a[i].t)break;//达标
}
}
printf("%d\n",ans);
return 0;
}