公交换乘

· · 个人记录

[CSP-J 2019] 公交换乘

题目描述

著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:

  1. 在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间与开始乘地铁的时间之差小于等于 45 分钟,即: t_{bus} - t_{subway} \leq 45
  2. 搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优惠票搭乘公交车。
  3. 搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。

现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?

因为最开始并没有考虑等于45分钟的情况,所以一直错以下为最初代码:

#include <bits/stdc++.h>
using namespace std;
int c,pr,t,ans=0,n,tic=0,m;
struct sub{
    int tt;
    int pp;
}a[110000];
int main(){
    int j=1;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>c>>pr>>t;
        if(c==1){
            if(tic>=1){
                m=tic;
                if(m>=45) m-=45;
                else m=1;
                for(int k=m;k<=tic;k++){
                    if(a[k].pp>=pr&&t-a[k].tt<45){
                        pr=0;
                        a[k].pp=0;
                        break;
                    }
                }
            }
        }
        else{
            a[j].pp=pr;
            a[j].tt=t;
            j++;
            tic++;
        }
        ans=ans+pr;
    }
    cout<<ans;
    return 0;
}

改后为:


#include <bits/stdc++.h>
using namespace std;
int c,pr,t,ans=0,n,tic=0,m;
struct sub{
    int tt;
    int pp;
}a[110000];
int main(){
    int j=1;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>c>>pr>>t;
        if(c==1){
            if(tic>=1){
                m=tic;
                if(m>=46) m-=45;
                else m=1;
                for(int k=m;k<=tic;k++){
                    if(a[k].pp>=pr&&t-a[k].tt<=45){
                        pr=0;
                        a[k].pp=0;
                        break;
                    }
                }
            }
        }
        else{
            a[j].pp=pr;
            a[j].tt=t;
            j++;
            tic++;
        }
        ans=ans+pr;
    }
    cout<<ans;
    return 0;
}