携程笔试

100/100/15/100

第三题求一下解答,顺便贴一下第四题较笨的解法(就是暴力双重循环优化了下,分组二分)

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, x;
    cin >> n >> x;
    map<int, vector<int>> cnt;
    long long ret = 0;
    for (int i = 0; i < n; ++i)
    {
        int num;
        cin >> num;
        int cnt5 = 0, cnt2 = 0;
        while (num % 5 == 0)
        {
            num /= 5;
            cnt5++;
        }
        while (num % 2 == 0)
        {
            num /= 2;
            cnt2++;
        }
        cnt[cnt5].push_back(cnt2);
    }
    for (int i = 0; i < cnt.size(); ++i)
        sort(cnt[i].begin(), cnt[i].end());

    for (int k = 0; k <= 12; ++k)
    {
        for (int i = 0; i < cnt[k].size(); ++i)
        {
            int pivot = cnt[k][i];
            for (int k2 = k; k2 <= 12; ++k2)
            {
                if (cnt[k2].size() == 0 || k2 + k < x)
                    continue;
                int pos = lower_bound(cnt[k2].begin(), cnt[k2].end(), x - pivot) - cnt[k2].begin();
                if (k2 == k)
                    ret += cnt[k2].size() - max(pos, i + 1);
                else
                    ret += cnt[k2].size() - pos;
            }
        }
    }
    cout << ret << endl;
    return 0;
}

#笔试##携程笔试##秋招##校招#
全部评论
第三題a了。简单来说是找到最大和最小的倍数i,使得b-a在[i*l,i*r]。在ceil((b-a)/r) 到 floor((b-a)/l)之间做判断就好
2 回复 分享
发布于 2022-10-18 21:31 美国
第四题是末位0的个数还是数里面有0就算啊
1 回复 分享
发布于 2022-10-18 21:08 山东
以为第三题好做,结果最后不对,第四题没时间做了,暴力没出来,该先做最后一题,后悔死了
点赞 回复 分享
发布于 2022-10-18 21:20 上海
求一下第二题,我甚至怀疑是自己看错题了。。。
点赞 回复 分享
发布于 2022-10-18 21:33 江苏
点赞 回复 分享
发布于 2023-03-03 18:46 上海

相关推荐

点赞 评论 收藏
分享
评论
点赞
4
分享
牛客网
牛客企业服务