HNU 实验五 拜访朋友

题目

在这里插入图片描述

思路

其实一开始的思路是利用一个大数组,将每个公交站点都记录在对应下标的位置并把值赋1,最后统计0到n公交站点的数目看看是否有那么多个公交站点。但这个思路其实是有bug的,比如如果路线是2-3 4-5 而3-4之间没有公交车可以到达,那么根据题意这种情况是不行的,但是这个思路写出来的代码忽略了这种情况。
正确的思路是,利用一个多次循环,将最终站点m的位置不断更新,更新的条件是m在某辆公交车的始末位置之间,值为始发位置。多次更新后,看看m是否小于等于0,是的话就是Yes。
因为如果能到达位置为m的点,那么m必定在某辆公交车的区间内部,即等价于能否到达这辆公交车的起始点。一直更新下去,如果最初的起始点在小希(怎么又是小希?? )家或者家的左侧那么就一定可以达到。有点greedy贪心的意思了嗷。

AC代码

错误思路的代码,好想更加的grace

#include <bits/stdc++.h>
using namespace std;

//第四组数据错了
int main() {
	int n, m, l, r;
	cin >> n >> m;
	int bus[m + 1];
	memset(bus, 0, sizeof bus);
	for (int i = 1; i <= n; ++i) {
		cin >> l >> r;
		if (l < 0)
			l = 0;
		if (r < 0)
			continue;
		for (int j = l; j <= r; ++j) {
			if (j > m)
				break;
			else
				bus[j] = 1;
		}
	}
	bool flag = true;
	for (int i = 0; i <= m; ++i) {
		if (bus[i] == 0)
			flag = false;
	}
	if (flag)
		cout << "Yes";
	else
		cout << "No";
}

正确的

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	int arr[n][2];//用一个二维数组来记录公交策划
	for (int i = 0; i < n; ++i) {
		cin >> arr[i][0] >> arr[i][1];
	}
	int index = 0;//定义一个循环次数的变量
	//为什么要这么做呢 因为公交车的始末位置不确定 所以要多次循环
	//最差的情况是循环了n次 所以我们认为循环n次即可
	while (++index) {//注意先加后用 后加先用进不去这个循环
		for (int i = 0; i < n; ++i) {
			if (arr[i][0] <= m && m <= arr[i][1])
				m = arr[i][0];//更新为最左边的数
		}
		if (index == n)
			break;
	}
	if (m <= 0)
		cout << "Yes";
	else
		cout << "No";
}

后记

好好审题!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一袍清酒付825

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值