题目描述
著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:
- 在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即: tbus−tsubway≤45
- 搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。
- 搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。
现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?
输入格式
输入文件的第一行包含一个正整数 n,代表乘车记录的数量。
接下来的 n 行,每行包含 3 个整数,相邻两数之间以一个空格分隔。第 i 行的第 1 个整数代表第 i 条记录乘坐的交通工具,0 代表地铁,1 代表公交车;第 2 个整数代表第 i 条记录乘车的票价pricei ;第三个整数代表第 i 条记录开始乘车的时间 ti(距 0 时刻的分钟数)。
我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。
输出格式
输出文件有一行,包含一个正整数,代表小轩出行的总花费。
输入 #1
6
0 10 3
1 5 46
0 12 50
1 3 96
0 5 110
1 6 135
输出 #1
36
这题看上去可能没有什么思想,俗话说抽象不出来。
但是这题根本就不用抽象!!!!!!
直接用代码模拟他就好了
这不就是天津地铁干的活吗为啥让我来
用一个队列模拟优惠券箱,但是我这里大炮打蚊子了,用了两个队列
相当于遍历整个队列,由于队列无法进行关于下标的操作,所以每次都把不用的优惠卷弹出去,到备用队列。发现此优惠卷可以用时,再将备用队列的弹回来就好了。
# include <iostream>
# include <cstdio>
# include <algorithm>
# include <deque>
using namespace std;
# define int long long
int n,sum;
struct node{
int num;
int p;
int t;
};
int num1,p1,t1;
deque <node> q;
deque <node> q1;
signed main(){
scanf("%lld",&n);
for (int i=1;i<=n;i++){
scanf("%lld%lld%lld",&num1,&p1,&t1);
if (num1==0){
node x;
x.num=num1;
x.p=p1;
x.t=t1;
q.push_back(x);
sum+=p1;
}else{
while(!q.empty()&&t1-q.front().t>45){
q.pop_front();
}
bool flag=false;
while(!q.empty()){
node x=q.front();
q.pop_front();
if (p1<=x.p){
flag=true;
break;
}else{
q1.push_back(x);
}
}
if (flag==false){
sum+=p1;
}
while(!q1.empty()){
node x=q1.back();
q1.pop_back();
q.push_front(x);
}
}
}
printf("%lld",sum);
return 0;
}