0、题目概述
【问题描述】
小希想去拜访一位朋友,他家位于坐标轴的0点,他朋友的家在坐标点 m(m>0)。
在这条线路上有多路公交车通行,运行区间位于[x,y]之间,x、y为整数,在该区间内的任意整数点都设有公交站,小希可以在任意站上下。
请编程确定小希是否可以搭乘公交车到达朋友家。
【输入形式】
输入第1行为两个正整数 n 和 m,表示公交车的线路数以及小希朋友家的位置。
接下来的 n 行,每行两个整数a、b,表示每路公交车的起点和终点,输入保证a<b且b<100000000。
【输出形式】
输出Yes或No,表示小希是否能搭乘公交去拜访朋友。
【样例输入】
3 5
0 2
2 4
3 5
【样例输出】
Yes
【样例说明】
样例中,小希可以从0(家)坐公交车到达2,然后坐公交到3,再从3到5(朋友家)。
【评分标准】
1、分析
这一题稍微有些思维上的难度。初次看到时的想法是贪心,但是不需要想这么多。我们要考虑的有两个点:(1)尽可能走远(2)中间不能有左路(中间各个公交车站的范围相连)
2、解决方案
将相连的车站“合并”。例如:两辆车是[1,4]和[2,6],合并之后是[1,6]。取当前可以到达的位置是place,则取place=6,到最后如果place>=m,则可以到达。
但是这么做会报错,因为没有考虑合并过后的首末是否相连。例:假设m=10,合并之后是[0,5]和[7,12],这样并不能到达。所以我们很自然想到,如果只有在当前区间[min,max]的min<=place<=max的情况下才取place=max,就会避免这种断点的情况。
这么做是我的初步思路,在实现的时候我借鉴了另外一位大佬的思路:每辆公交车最多只乘坐一次。这么做可以控制循环的次数,避免死循环的情况。
3、代码
#include <iostream>为避免学校oj系统查重抄袭,所有变量在使用时请进行修改
using namespace std;
int main()
{
int aaa,bbb;
cin>>aaa>>bbb;
int stop[aaa][2];
for(int iii=0; iii<aaa; iii++)//数组第一行读入车站的起始点,第二行读入结束点
{
for(int jjj=0; jjj<2; jjj++)
{
cin>>stop[iii][jjj];
}
}
for (int xxx=0; xxx<aaa; xxx++)
{
for (int yyy=0; yyy<aaa; yyy++)
{
if ((stop[yyy][0]<=bbb)&&(stop[yyy][1]>=bbb))
{
bbb=stop[yyy][0];
}//如果min<=place<=max,那么回到的最远处“往前移”
}
}
if (bbb<=0) cout<<"Yes";
else cout<<"No";
return 0;
}
4、总结
这道题身边的同学讨论的比较多,我在做的时候也有些卡手。总结一下有以下几点:
(1)最终位置m太大,无非开数组a[m]暴力模拟。
(2)没有想到每辆车只能做一次这一限制条件。
感谢大佬squidsss的文章给我了第二点的解决思路
附上原文链接
拜访朋友