兔子跳

103 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

题目信息描述

一只兔子位于二维平面的原点 (0,0)(0,0) 处,它想通过一系列的跳跃,跳到点 (x,0)(x,0) 处。

给定一个长度为 nn 的数组 a1,a2,…,ana1,a2,…,an。

兔子能从一个点跳到另一个点,当且仅当两点之间的距离等于上述数组中的某个元素的值。

请问,兔子从 (0,0)(0,0) 到 (x,0)(x,0) 最少需要跳几次?

注意,兔子可以跳到非整数坐标的点上。

例如,当 x=4x=4,a={1,3}a={1,3} 时,(0,0)→(1,0)→(4,0)(0,0)→(1,0)→(4,0) 和 (0,0)→(2,5√)→(4,0)(0,0)→(2,5)→(4,0) 均为合理最佳方案之一。

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

每组数据第一行包含两个整数 nn 和 xx。

第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。

输出格式

每组数据输出一行结果,表示最少跳跃次数。

数据范围

1≤T≤10001≤T≤1000, 1≤n≤1051≤n≤105, 1≤x≤1091≤x≤109, 1≤ai≤1091≤ai≤109,aiai 各不相同。 保证同一测试点内所有 nn 的和不超过 105105。

输入样例:

4
2 4
1 3
3 12
3 4 5
1 5
5
2 10
15 4

输出样例:

2
3
1
2

思路

思路1

先判断能不能一次整好跳过去,如果可以,输出1。 如果不能一次整好跳到,就用最长的跳。两次最长的可以跳到 0 到 最长距离中间的任何一个距离。 跳的次数等于:(x + max(a) - l) / max(a)。 (x / l 向上取整)

思路2

(暴力枚举) O(n2)O(n2) 1.如果可以一步,则1步

2.如果有比x还大的步子,通过构成一个三角形,2步可以搞定

3.如果最长的步子比x小。就迈最大的步子

代码

# include <bits/stdc++.h>
using namespace std;
​
int main()
{
    int T;    cin >> T;
    while (T --)
    {
        int n;    cin >> n;
        int x;    cin >> x;
        vector<int> a (n);
        for (int i = 0; i < n; i ++)
            cin >> a[i];
​
        if (count(a.begin(), a.end(), x) > 0)
        {
            cout << 1 << endl;
        }
        else
        {
            int max_num = *max_element(a.begin(), a.end());
            if (max_num > x)
            {
                cout << 2 << endl;
            }
            else
            {
                if (x % max_num == 0)
                    cout << x / max_num << endl;
                else
                    cout << x / max_num + 1 << endl;
            }
        }
    }
​
​
    return 0;    
}
​