题目: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;
}