球球大佬看下,我这思路真的不行吗qwq
查看原帖
球球大佬看下,我这思路真的不行吗qwq
511811
崛起的滑稽楼主2024/6/5 20:24

贪心10pts,hank数据通过,其余全wa 到目前为止已经卡了2h+了 没有看题解和别人的讨论思路所以有点怀疑自己方向是不是都错了……

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1010;
const int MAXM=1e4+10;
struct Passenger{
	int t,a,b;
}p[MAXM];
int n,m,k,ans;
int d[MAXN];//d[i]:车站i-1,i间的行驶用时,前缀和后为离开站点i的时间点
int c[MAXN];//差分数组,还原差分数组后,c[i]表示车站i,i+1间车上的人数
int e[MAXN];//在运算加速时使用的临时数组,e[i]代表当前加速情况前离开站点i的时间点
int f[MAXN];//f[i]:到达站点i的时间点
int stops[MAXN];//每个站最晚上车的时间点
priority_queue<pair<int,int>> q;//first:区间内人数,second:区间编号  优先加速人多的区间,所以采用优先队列
void solve(){//临时求前缀和
	for(int i=1;i<=n;++i){
		e[i]=d[i]+e[i-1];//前缀和
		e[i]=max(e[i],stops[i]);//如果到了站但是还有人没上车,等待到上车再出发
	}
}
int main(){
	//freopen("P1315_3.in","r",stdin);
	cin>>n>>m>>k;
	for(int i=2;i<=n;++i){
		cin>>d[i];
	}
	for(int i=1;i<=m;++i){
		cin>>p[i].t>>p[i].a>>p[i].b;
		++c[p[i].a];
		--c[p[i].b];//差分填充区间
		stops[p[i].a]=max(stops[p[i].a],p[i].t);//最晚上车的
	}
	for(int i=1;i<n;++i){
		c[i]+=c[i-1];//还原各个站点间有几个乘客坐车
		q.push(make_pair(c[i],i));//存入优先队列进行排序
	}
	while(k&&!q.empty()){
		//cout<<"加速:"<<q.top().second<<endl;
		solve();
		int index=q.top().second+1;
		if(e[index-1]+d[index]-stops[index]<=0){//如果加速前到达下一站没有到下站最晚上车的时间,加速是没有必要的
			q.pop();
			continue;
		}
		int tmp=min(min(k,d[index]),e[index-1]+d[index]-stops[index]);//加速直到:加速机会用完/用时归零/到达下一站等于到下站最晚上车的时间(此时再加速没必要了)
		k-=tmp;
		d[index]-=tmp;
		//cout<<"加速值:"<<tmp<<endl;
		q.pop();
	}
	for(int i=1;i<=n;++i){
		d[i]+=d[i-1];//前缀和
		f[i]=d[i];
		d[i]=max(d[i],stops[i]);
	}
	for(int i=1;i<=m;++i){
		ans+=f[p[i].b]-p[i].t;
		//cout<<f[p[i].b]<<' '<<p[i].t<<endl;
	}
	cout<<ans;
	return 0;
}
2024/6/5 20:24
加载中...