zoukankan      html  css  js  c++  java
  • CodeForces

    题意:

    n个数,求出这些数中满足 ai >= aj 的 ai % aj 的最大值。

    排序去重,然后对于每一个a[i], 如果找到a[i] 的一个倍数 k*a[i] (k > 1)的位置,那么它之前的第一个数字就是一个使a[j] % a[i] 最大的可能的解。

    这样,枚举a[i] 所有的倍数,求最大的答案即可。

    如何找出 k * a[i] 的位置呢?因为数组是有序的,所以可以用二分查找。

    枚举所有 a[i] 的倍数最坏的复杂度是 n/1 + n/2 + n/3 + .... n/n = nlogn,加上二分查找的复杂度是 n*logn*logn。

    lower_bound(a+1, a+1+n, x) - (a+1),可以二分查找在区间 a[1...n] 找到小于 x 的最大值的位置。

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    #define maxn 200000 + 100
    
    int main()
    {
        int n, a[maxn];
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
    
        sort(a+1, a+1+n);
        n = unique(a+1, a+1+n)-(a+1); //去重
    
        int ans = 0;
        for (int i = 1; i <= n; i++)
        {
            for (int j = a[i]; j <= a[n]; j += a[i])
            {
                int x = lower_bound(a+1+i, a+1+n, j+a[i])-(a+1);
                ans = max(a[x]%a[i], ans);
            }
        }
    
        printf("%d
    ", ans);
    }
  • 相关阅读:
    contextMenu,右键菜单
    hashchange
    web攻击日志分析之新手指南
    工匠人生
    数学有卵用之通信篇
    精英主义(一)
    flaskbb部署笔记
    深入分析一波,你们说的云安全到底是什么鬼?
    Gh0st与云安全
    困境与突破
  • 原文地址:https://www.cnblogs.com/ruthank/p/9427102.html
Copyright © 2011-2022 走看看