上海十二月月赛T3数轴旅行

题目如下:

题目描述

你要开始一场数轴旅行,初始时,你所在的位置为 x = 0 ,你想要去 x = d 位置。

给定 n 个整数a[1],a[2]​,...a[n]​,表示每次你可以往左移动 ai​ 个单位或往右移动 ai​ 个单位。

请问,最终能否到达 x = d 位置?能则输出 Yes,不能输出 No

输入格式

输入共两行:
第一行,两个整数 n,d
第二行,n 个正整数a[1]​,a[2]​,...a[n​]

输出格式

输出能否达到最终目标位置。

题目分析

其实,这道题与余数有关。如,输入为3、6、9、12、15......但只有3有用,因为6、9、12、15......3都能到达(余数为0)。这道题首先创建一个变量t去求最小步数,并默认第一个为最小步数。然后去循环,如果总路程除尽了最小步数或当前步数,就证明能到达。如果当前步数与最小步数之间有余数,就更新最小步数(余数<除数)。最后判断输出即可。

AC代码如下

#include<bits/stdc++.h>
using namespace std;
long long n, d, a[100005], t;
int main(){
    cin >> n >> d;
    for(int i = 1;i <= n;i++){
    	cin >> a[i];
	}
	t = a[1];         //默认第一个为最小步数 
	if(d % a[1] == 0){//判断是否能到达 
    	cout << "Yes";
    	return 0;
	}
	for(int i = 2;i <= n;i++){
		if(d % a[i] == 0 || d % t == 0){      //是否能到达 
    		cout << "Yes";
    		return 0;
		}
		else if(a[i] % t != 0){       //如果有余数,说明有最小步数,余数小于除数 
			t = max(a[i], t) % min(a[i], t);//更新最小步数 
		}
	}
	if(d % t == 0){    //判断输出 
		cout << "Yes";
	}
	else{
		cout << "No";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值