CodeForces 485D Maximum Value 技巧枚举 + 二分

题目https://cn.vjudge.net/problem/CodeForces-485D

题意:给出n个整数,求这里面任取两个数取模的最大值
注:(1)最多2e5个数,数字大小1到1e6
(2)大数膜小数

思路:对于一个数a,要使b%a最大,自然要找大于等于a的倍数且最接近的数作为b。由此,我们先将数排序、去重,然后枚举每一个a和它的倍数,二分找到大于等于比这个数的最小的数b,计算b%a比较求出最大值。
时间复杂度O(n*logn+n*log(1e6)*log(n))

代码:c++

#include <cstdio>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <cstring>
#include <set>
#include <stack>
#include <cstdlib>
#include <bitset>
using namespace std;

const int maxv = (int)1e6 + 10;
const int maxn = (int)2e5 + 10;

int n;

int a[maxn];
int maxval;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        maxval = max(maxval, a[i]);
    }
    sort(a, a + n);
    n = unique(a, a + n) - a;
    int ans = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = a[i]; j - a[i] <= maxval; j += a[i])
        {
            int p = lower_bound(a, a + n, j) - a;
            if (p != 0 && a[p - 1] > a[i])
            {
                ans = max(ans, a[p - 1] % a[i]);
            }
        }
    }
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Rewriter_huanying/article/details/81414327