【问题描述】
小希想去拜访一位朋友,他家位于坐标轴的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(朋友家)。
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int a[n][2]; //定义二维数组存储路线
for(int x=0;x<n;x++)
{
for(int y=0;y<2;y++)
{
cin>>a[x][y]; //输入数据
}
}
int num=0; //定义循环次数
do
{
for(int i=0;i<n;i++)
{//进行循环当m位于某段线路之间时,将m变更为路线的最初位置
//因为若有路线的最初位置到m之间可换乘,则在路线的最初位置一定可换乘
if((a[i][0]<=m)&&(a[i][1]>=m))
{
m=a[i][0];
}
}
num++; //计数加一
}while(num<n);
//当可回到原点时,换乘最多每辆车均乘坐一次,所以循环多次后m变更为路线中的最小位置
if(m<=0) cout<<"Yes"; //若位置<=0,可到达
else cout<<"No"; //否则,不行
return 0;
}
ps:一个稍有问题的方法(如下)
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int a[n][2]; //定义二维数组存储路线
for(int x=0;x<n;x++)
{
for(int y=0;y<2;y++)
{
cin>>a[x][y]; //输入数据
}
}
int begin,end; //定义开始begin,结尾end
begin=a[0][0]; //赋值第一组的数值
end=a[0][1];
for(int i=1;i<n;i++) //进行循环将较小值赋给begin,较大值赋给end
{
if((a[i][0]<=begin)&&(a[i][1]>=begin)) begin=a[i][0];
if((a[i][0]<=end)&&(a[i][1]>=end)) end=a[i][1];
}
if((begin<=0)&&(end>=m)) cout<<"Yes"; //最终范围囊括0到m,则输出yes
else cout<<"No";
return 0;
}