❤大爱小颜❤

转身,一缕冷香远,逝雪深,笑意浅。来世你渡我,可愿?
扩大
缩小

【洛谷】P5661公交换乘

记得去年考这道题的时候

我做了2小时。。

但是洛谷我AC了(哈哈哈哈嗝)

题目https://www.luogu.com.cn/problem/P5661

 

Part 1

看到这题第一反应是“这么简单的一题啊”

直接模拟即可。记录上一张票的截止时间,逢公交判断即可。

5min after...

诶肿么样例输错了?![蒟蒻在线懵逼]

好再来康康...

“免费搭乘一次票价不超过地铁票价的公交车。”

。。。还有这要求?

Part 2

然鹅可以记录下每次可用票的区间[x,y]的x和y,于是循环可以从x至y,就不会T了。

可用票的区间定义为:全体“未过期”的票包含在此区间内。

于是代码就有了。。

#include<iostream>
using namespace std;
  //【1.建立结构体】
struct Ticket
{
    int price;
    int last;//最晚使用时间
    bool used;//是否已使用
};
Ticket tic[100001];
  //【2.输入部分】
int main() 
{
    bool bus; 
    int t,pri,x=1,y=0;//pri为每次输入的价格,x,y如上所述
    int n,sum=0;//sum记录钱数
    cin>>n;
  //【3.地铁的情况】
    for(int i=1;i<=n;i++)
    {
        cin>>bus>>pri>>t;
        if(!bus)
        {
              //添加一张新票
            y++;
            tic[y].last=t+45;
            tic[y].price=pri;
            tic[y].used=false;
            sum+=pri;
        }
  //【4.公交的情况】
        else
        {
            bool can=false;//能否使用优惠票
            int newx=x;
            for(int j=x;j<=y;j++)
            {
                                //如果该票已过期就改编区间左端点的值
                if(tic[j].last<t)
                {
                    newx=j;
                    continue;
                }
  //如果能使用就立即退出循环并标记
                if((tic[j].price>=pri)&&(!tic[j].used))
                {
                    can=true;
                    tic[j].used=true;
                    break;    
                }
            }
  //刷新x的值
            x=newx;
  //刷新sum
  //如果can是true,sum就加0*pri
  //反之加1*pri
            sum+=(!can)*pri;
        }
    }
  //【5.输出及返回】
    cout<<sum<<endl;
    return 0;
}

各位码友YiQiNuLi!!!

 

posted on 2020-11-04 21:59  小颜太可了  阅读(293)  评论(0)    收藏  举报

导航