时隔多月,终于准备再水一篇博客了,还有9天就CSP提高了,考完没一等奖就当中考er了,应该就不会怎么动这个博客了。
这次考三道题,两道CSP2019-J原题,重温一下那种感觉吧。
T1:公交换乘
这道题是CSP2019-J的T3,满满的怀旧,当年就挫败在了这道题之下,现在一看,就一道模拟嘛。
思路:题目给的很明确:
如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满足条件,则优先消耗获得最早的优惠票。
我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现在同一分钟。
记录既然按时间顺序给出,而票又一定是先用符合条件且先得到的,就不需要考虑哪张优惠劵先用这些诸如此类的乱七八糟的问题了。
- 最开始一看,直接数组模拟线性过一遍就完事,结果每次扫优惠劵放到数组里都从头扫到尾,直接就扫炸了。
还是我太蒻了 - 然后,细细一想,原来没有控制下边界,每次扫的时候不能扫完,用时间把数组约束到一个范围里,再从最先获得的票开始找,就直接改一下原来的代码,把数组改成数组模拟队列就完事了。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,ans,tail,head;
struct node {
int t,p;
} tik[100010];//结构体模拟优惠券,存过期时间和券的价值
bool vis[100010];//标记这张优惠劵是否用过
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
int ki,pr,ti;
cin>>ki>>pr>>ti;//kind,price,time
if(ki==0)