拜访朋友

【问题描述】

   小希想去拜访一位朋友,他家位于坐标轴的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;
} 

解释:我们用begin,end想表示公交车想运行的最远路线,但只循环了一次,会丢失数据


ps:n=5,m=16,第一组-3 1;第二组2 8;第三组7 16;第四组1 5;第五组14 17;


因为只循环一次,所以begin=-3,end=5;丢失了中间和末尾的数据,欲改正可像上例设置while循环,进行若到达两端最小乘车次数的循环即可




  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值