题意请看@SiriusRen。还有这个人是multiset。。可以找他。。看题解
思路很好想。就是贪心。
有人就让上,
超载就让目的地最远的下去【因为他占地时间最长吗。影响的也最多】
该下车的下车
所以麻烦在于 靠 怎么实现。
于是我选择 死亡 不 优先队列。
所以优先队列维护的应该是 最远的
又因为想扫一遍起点所以拿vector存了一遍起点航线的信息。
注意统计一下能够下车的人就好了【听起来好像黑车啊哈哈哈】
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#define maxn 10010
using namespace std;
struct data
{
int t,c; //c是乘客数量
data(int a,int b)
{
t=a;
c=b;
}
bool operator < (const data &a) const
{
return t<a.t;
}
};
vector<data> v1[maxn], v2[maxn];
int k, n, c, num[2][maxn], ans;
priority_queue<data> pq;
int work(vector<data> vv[], int k)
{
priority_queue<data> pq;
int res = 0, tmp = 0;
for (int i = 1; i <= n; i++)
{
res += num[k][i]; //以运输的乘客
tmp -= num[k][i]; //飞机上多少个人
for (int j = 0; j < vv[i].size(); j++)
{
tmp += vv[i][j].c;
pq.push(vv[i][j]);
}
while(tmp > c)
{
data tt = pq.top();
pq.pop();
if (tmp - c >= tt.c)
{
tmp -= tt.c;
num[k][tt.t] -= tt.c; //不让上飞机
}
else
{
num[k][tt.t] -= tmp - c;//不让上飞机
tt.c -= tmp - c;
tmp = c;
pq.push(tt);
}
}
}
return res;
}
int main()
{
scanf("%d%d%d",&k,&n,&c);
for(int i=1;i<=k;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x<y)
{
v1[x].push_back(data(y,z));
num[0][y]+=z;
}
else
{
x=n-x+1;
y=n-y+1;
v2[x].push_back(data(y,z));
num[1][y]+=z;
}
}
ans+=work(v1,0);
ans+=work(v2,1);
printf("%d\n",ans);
return 0;
}