题意
在一条路上有N个站点(起点是1,终点是N),在K个站上有几群牛,牛的数量为mi,起点和终点分别为si和ei。现在有一辆容量为C的车从1站点到N站点,求出一共有多少头牛可以从它们的起点达到它们要去的地方。(每个站上的牛群可以只上一部分)
思路
贪心,记录经过每个站点上时车上牛的数量,如果能上就给它上(按终点从小到大排序)。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int k,n,c,car[50001],mi,ans;//car[i]表示经过第i个站时车上有多少牛
struct node{
int s,e,v;
}cow[50001];
bool cmp(node a,node b) {return a.e<b.e;}
int main()
{
scanf("%d%d%d",&k,&n,&c);
for (int i=1;i<=k;i++)
scanf("%d%d%d",&cow[i].s,&cow[i].e,&cow[i].v);
sort(cow+1,cow+k+1,cmp);
for (int i=1;i<=k;i++)
{
mi=2147483647;
if (car[cow[i].s]>=c) continue;//如果当前车上的牛不能再多出空位了就跳过
for (int j=cow[i].s;j<cow[i].e;j++)
{
mi=min(c-car[j],mi);//我们当前坐的牛被这段路上car上的牛的数量约束
if (!mi) break;
}
if (mi>=cow[i].v)//如果剩下的位置比我们当前需要的位置多
{
for (int j=cow[i].s;j<cow[i].e;j++)
car[j]+=cow[i].v;//我们就可以让car坐上cow.v头牛
ans+=cow[i].v;
}
else
{
for (int j=cow[i].s;j<cow[i].e;j++)
car[j]+=mi;//否则我们最多坐mi头牛
ans+=mi;
}
}
printf("%d",ans);
}