P5661 [CSP-J2019] 公交换乘
首先暴力很好做,存下所有优惠票的数据,发现公交车就枚举每张票,最坏时间复杂度 ,无法通过。
注意到每张优惠票有效期只有 分钟,且不会有两次乘车记录出现在同一分钟,所以最多只有 张有效的票,其余票可以直接弹掉。
时间复杂度直接降到了 。
代码:
#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) 收藏 举报 来源