题目
思路
其实一开始的思路是利用一个大数组,将每个公交站点都记录在对应下标的位置并把值赋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";
}
后记
好好审题!!