思路:
直接暴力,找到x/2+1的位置,然后往前判断。如果小于当前答案了的话就break
肯定是跑不满的。因为n大了的话a权值的排列也会更密集。
c o d e code code
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n, ans;
int a[1000010];
int main() {
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;
for(int i = 1; i <= n; i ++) {
int k = lower_bound(a + 1, a + 1 + i, a[i] / 2 + 1) - a;
int maxx = a[i] % a[k];
ans = max(ans, a[i] % a[k]);
for(int j = k - 1; j >= 1; j --) {
ans = max(a[i] % a[j], ans);
if(maxx == -1) maxx = a[i] % a[j];
else if(a[j] <= maxx) break;
maxx = max(maxx, a[i] % a[j]);
}
}
printf("%d", ans);
return 0;
}