题目大意
给出 n n n个数,求 m a x ( a [ i ] m o d a [ j ] ) max(a[i]\ mod\ a[j]) max(a[i] mod a[j]) ( i , j ∈ [ 1 , n ] , i ! = j 且 a [ i ] > a [ j ] ) (i, j∈[1, n], i != j且a[i] > a[j]) (i,j∈[1,n],i!=j且a[i]>a[j])
解题思路
记
m
a
x
n
maxn
maxn为
m
a
x
(
a
[
i
]
)
(
i
∈
[
1
,
n
]
)
max(a[i])(i∈[1,n])
max(a[i])(i∈[1,n])
求出比
1
m
a
x
n
1~maxn
1 maxn里任意一个数
x
x
x小的最大的
a
[
i
]
a[i]
a[i]记为
b
[
x
]
b[x]
b[x]
枚举
a
[
i
]
a[i]
a[i]的倍数就好了
复杂度是
O
(
m
a
x
(
a
i
)
+
n
l
o
g
n
)
O(max(a_i)+nlogn)
O(max(ai)+nlogn)
A c c e p t e d c o d e Accepted\ code Accepted code
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e6 + 5;
int n, maxn;
int a[N], b[N], c[N>>1];
inline void read(int &f) {
f = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) f = f * 10 + c - 48, c = getchar();
}
int main() {
scanf("%d", &n);
int n1 = 0;
for (int i = 1, x; i <= n; ++i) {
read(x);
if (!c[x]) c[x] = 1, a[++n1] = x, maxn = max(maxn, x);
}
n = n1;
sort(a + 1, a + n + 1);
int x = a[1] + 1;
a[n+1] = maxn * 2;
for(int i = 2; i <= n + 1; i++)
while(x <= a[i])
b[x++] = a[i-1];
int ans = 0;
for(int i = 1; i <= n; i++)
for(int j = a[i] * 2; j <= maxn * 2; j += a[i])
ans = max(ans, b[j] % a[i]);
printf("%d\n", ans);
}