兔子条
一只兔子位于二维平面的原点 (0,0) 处,它想通过一系列的跳跃,跳到点 (x,0) 处。
给定一个长度为 n 的数组 a1,a2,…,an。
兔子能从一个点跳到另一个点,当且仅当两点之间的距离等于上述数组中的某个元素的值。
请问,兔子从 (0,0) 到 (x,0) 最少需要跳几次?
注意,兔子可以跳到非整数坐标的点上。
例如,当 x=4,a={1,3} 时,(0,0)→(1,0)→(4,0) 和 (0,0)→(2,5√)→(4,0) 均为合理最佳方案之一。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含两个整数 n 和 x。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
每组数据输出一行结果,表示最少跳跃次数。
数据范围
1≤T≤1000,
1≤n≤105,
1≤x≤109,
1≤ai≤109,ai 各不相同。
保证同一测试点内所有 n 的和不超过 105。
输入样例:
4
2 4
1 3
3 12
3 4 5
1 5
5
2 10
15 4
输出样例:
2
3
1
2
思路:
如果出现ai=x 则表示最少移动一次
如果ai>x 则 最少移动两次 在一个轴上移动2/x 另一个轴上移动根号下ai的方减去(x/2)的方
如果ai<x 则最少移动(x+a/a)-1次
当移动了x/ai次后 兔子里终点的距离不足 ai的距离 可以把剩下一小段+兔子上次跳的ai看成 兔子两次跳的距离 像上一种一样后两次在一个轴上先跳x/2(x=x-((x/a)-1)*a)次
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int T;
scanf("%d", &T);
while (T -- )
{
int n, x;
scanf("%d%d", &n, &x);
bool flag = false;
int a = 0;
while (n -- )
{
int t;
scanf("%d", &t);
if (t == x) flag = true;
a = max(a, t);
}
if (flag) puts("1");
else if (x < a) puts("2");
else printf("%d\n", (x + a - 1) / a);
}
return 0;
}
www.acwing.com
y总yyds