【洛谷】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!!!
浙公网安备 33010602011771号