题目链接:codeforces D.Maximum Value
题意:
给出n个数字,现在要从中找到两个数字(可以是同一个) ai , aj ,使得ai mod aj 最大并且 ai≥aj。
思路:
这道题暴力肯定过不去,第一次想法数组去重后使用dp来减少重复,结果还是过不去。看了题解才懂。先对数组进行排序,去重。对任意一个数字 ai 他的模最大值应该是数组中介于k*ai和(k+1)*ai中这个区间上的最后一个数字(最靠近(k+1)*ai),因此对每一个ai,二分查找他的倍数。对每个数遍历最终得到ans。
注意:
可能ai*2>a[n-1],最大值可能是a[n-1]%ai的模。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 2e5 + 10;
int a[maxn];
int main()
{
int n, i,j,ans=0;
cin >> n;
for (i = 0; i < n; ++i)
cin >> a[i];
sort(a, a + n);
for (i = 0; i < n; ++i)
{
//去重
if (a[i] == a[i - 1])continue;
int tmp = 0,ret=0;
for (j = 2 * a[i]; j <= a[n - 1]; j += a[i])
{
//二分查找倍数 找到数a[tmp]的前一个数a[tmp-1]肯定最大的
tmp = lower_bound(a+tmp, a + n, j) - a;
if (ret<a[tmp-1]%a[i])
{
ret = a[tmp - 1] % a[i];
}
}
//可能2*a[i]>a[n-1]
if (ret < a[n - 1] % a[i])ret = a[n- 1] % a[i];
if (ans < ret)ans = ret;
}
cout << ans;
return 0;
}