AcWing 1162. 公交换乘
原题链接
简单
作者:
沙漠绿洲
,
2020-07-13 21:27:47
,
所有人可见
,
阅读 567
(队列,模拟)
C++ 代码
#include<iostream>
using namespace std;
using PII = pair<int,int>;
const int N = 1e5 + 10;
PII q[N]; //数组模拟队列
int hh = 0, tt = -1; //队列头,尾
int main()
{
int n;
cin >> n;
int res = 0;
while(n--){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(a == 0){ //坐地铁
q[++ tt] = {c, b}; //时间和优惠价格
res += b;
}else{ //坐公交
while(hh <= tt && (q[hh].first < c-45 || q[hh].second == -1)) ++ hh;//去除已经过期的和已经用掉的优惠券
int i = hh, flag = 0;
while(i <= tt){ //优惠券队列非空
if(q[i].first >= c - 45 && q[i].second >= b){
//cout << "用掉时间为 "<< q[i].first<<" 时得到的优惠券,优惠:"<< q[i].second << endl;
q[i].second = -1; //优惠券用掉了
flag = 1;
break;
}
++i;
}
if(!flag){ //没有优惠券可用
res += b;
}
}
}
cout << res << endl;
return 0;
}