CSP-2019 公交换乘:
问题描述:
著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即: tbus−tsubway≤45
搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。
搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。
现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?
输入
输入文件的第一行包含一个正整数 n,代表乘车记录的数量。
接下来的 n 行,每行包含 3 个整数,相邻两数之间以一个空格分隔。第 i行的第 1 个整数代表第 i条记录乘坐的交通工具,0 代表地铁,1 代表公交车;第 2 个整数代表第 ii条记录乘车的票价price_i price_i;第三个整数代表第 i i条记录开始乘车的时间t_i t_i(距 0 时刻的分钟数)。
我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。
输出
输出文件有一行,包含一个正整数,代表小轩出行的总花费。
样例输入
6
0 10 3
1 5 46
0 12 50
1 3 96
0 5 110
1 6 135
样例输出
36
题目分析:
题解:
1:通过该题进行分析每一个时间点都有相对应的状态值。每一个时间点对应自身的价格、时间、交通方式的选择。
所以可以通过结构体进行定义。
2:题意中说明,时间在45分钟内的优惠券6才能使用。
3:定义一个结构体线性段,比较每一个时间点到其45分钟之间的时间点是否存在优惠券,如果存在就进行销毁(flag==1。)
4:先将每一个时间点的是价格相加起来,再从该点到45分钟之间的结构体进行查询,如果能用优惠券就将该时间点的价格减去。
```c
#include <iostream>
#include <queue>
using namespace std;
struct node_time{
int chose;
int price;
int time;
bool flag;
};
node_time t[100005];
int n,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
//cin>>t[i].chose>>t[i].price>>t[i].time;
scanf("%d%d%d",&t[i].chose,&t[i].price,&t[i].time);
ans+=t[i].price;
if(t[i].chose==0)
t[i].flag=1;//±ê??óDó??Y?±
int temp_time=i-45;
if(temp_time<0)
{
temp_time=1;
}
if(t[i].chose==1)
{
for(int j=temp_time;j<i;j++)
{
if(t[j].flag==1&&t[j].price>=t[i].price&&t[i].time-t[j].time<=45)
{
t[j].flag=0;
ans-=t[i].price;
break;
}
}
}
}
cout<<ans;
return 0;
}