P5661 [CSP-J2019] 公交换乘

首先暴力很好做,存下所有优惠票的数据,发现公交车就枚举每张票,最坏时间复杂度 O(n2)O(n^2),无法通过。

注意到每张优惠票有效期只有 4545 分钟,且不会有两次乘车记录出现在同一分钟,所以最多只有 4545 张有效的票,其余票可以直接弹掉。

时间复杂度直接降到了 O(n)O(n)

代码:

#include<bits/stdc++.h>
using namespace std;
int _, ans, head = 0, tail = -1;
struct node{
	int p, t, vis;//vis 记录是否使用
}q[100005];//用 q 队列存储优惠票
int main(){
	cin >> _;
	while(_ --){
		int op, p, t;
		cin >> op >> p >> t;
		if(op == 0){
			ans += p;
			q[++ tail] = {p, t, 0};
		}
		else{
			while(t - q[head].t > 45) head ++;//超市弹出
			bool use = 0;
			for(int i = head; i <= tail; i ++){
				if(q[i].p >= p && !q[i].vis){//注意一张票只能用一次
					q[i].vis = 1; use = 1;
					break;
				}
			}
			if(!use) ans += p;
		}
	}
	cout << ans;
	return 0;
}

posted on 2024-12-22 20:22  zhangzirui66  阅读(59)  评论(0)    收藏  举报  来源

导航