题目如下:
题目描述
你要开始一场数轴旅行,初始时,你所在的位置为 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;
}