AC了
2024-06-29 14:40:34
发布于:浙江
34阅读
0回复
0点赞
/*
首先按右端点从小到大排序
从最右边开始种树
正解是差分约束,不会!
*/
#include<cstdio>
#include<iostream>
using namespace std;
int m,n,zh[30001]={0},a[5001],b[5001],sz[5001];
void qsort(int s1,int s2) //手写快排
{
int mid1=b[(s1+s2)/2];
int i=s1,j=s2,t;
while (i<=j)
{
while (b[i]<mid1) i++;
while (b[j]>mid1) j--;
if (i<=j)
{
t=b[i];b[i]=b[j];b[j]=t;
t=a[i];a[i]=a[j];a[j]=t;
t=sz[i];sz[i]=sz[j];sz[j]=t;
i++;j--;
}
}
if (i<s2) qsort(i,s2);
if (j>s1) qsort(s1,j);
}
int main()
{
int zs=0,i,j,o;
cin>>m;
cin>>n;
for (i=1;i<=n;i++)
cin>>a[i]>>b[i]>>sz[i];
qsort(1,n);
for (i=1;i<=n;i++)
{
int js=0;
for (j=b[i];j>=a[i];j--)
if (zh[j]==1) js++; //计算区域内种了几棵树。
if (js<sz[i]) //如果不够
{
o=sz[i]-js; //求出还要种几棵树。
zs+=o; //累加树的棵数不解释
for (j=b[i];j>=a[i];j--) //从最右边开始种树
if (zh[j]==0) { if (o==0) break;zh[j]=1;o--; //当然注意要在没有树的地方才能种树。
}
}
}
cout<<zs; //最后输出最少种多少棵树
return 0;
}
这里空空如也
有帮助,赞一个