NOIP普及组 - 2019 - 公交换乘 题解

这篇博客主要介绍了NOIP普及组2019年的一道题目——公交换乘。作者分享了自己初次尝试只得到30分,后续优化后成功AC的经历。文章使用C++语言,通过一个结构体和主函数实现解题策略,并提供了详细代码,代码中包含注释以帮助理解。博主鼓励读者提问并期待点赞。

先来一个传送门

本题在洛谷难度定为“普及-”,其实并不是很难,但我第一次做的时候只有30分,剩余的都是TLE, 在我进行了一个修改后就AC了。

本题我用的是一个结构体和一个main函数,先来看看结构体

struct Node{
	long long time, price, vis = 0; // 没被用过是1,用过是2 
}a[100010];

每次乘地铁时进行一个这样的操作, 如果没看出有什么用,那就看接下来的代码

int main(){
	long long n, x, y, z, sum = 0, k = 1, last = 1; //n是乘车次数,x,y,z分别是要输入的三个数,sum是需要花的钱的总数,k是有多少张优惠券,last是从多少开始用优惠券 
	int flag = 0;  //判断是否使用优惠券 
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> x >> y >> z;
		if (x == 0){
			sum += y;
			a[k].time = z;
			a[k].price = y;
			a[k].vis = 1;
			k++;
		}
		if (x == 1){
			flag = 0;
			for (int j = last; j < k; j++){
				if(a[j].vis == 1 && a[j].price >= y && z - a[j].time <= 45){
					a[j].vis = 2;
					flag = 1;
					break;
				}
				if (z - a[j].time > 45){
					last = j;
				}
			}
			if (flag == 0)
				sum += y;
		}
	}
	cout << sum << endl;
	return 0;
}

大部分代码内容我都写上了注释,如果有没看懂的部分可以在这个博客下留言,我会来解答

谢谢观看,求点赞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值