51Nod 1421
有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。
Input
单组测试数据。 第一行包含一个整数n,表示数组a的大小。(1 ≤ n ≤ 2*10^5) 第二行有n个用空格分开的整数ai (1 ≤ ai ≤ 10^6)。
Output
输出一个整数代表最大的mod值。
Input示例
3 3 4 5
Output示例
2
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int MAXN = 2e5 + 10; int n; int a[MAXN]; template <class T> inline void scan_d(T &ret) { char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9') { ret = ret * 10 + (c - '0'), c = getchar(); } } int main(int argc, const char * argv[]) { cin >> n; for (int i = 0; i < n; i++) { scan_d(a[i]); } sort(a, a + n); int res, tmp, j; j = res = tmp = 0; for (int i = 1; i < n; i++) { tmp = a[i] % a[i - 1]; if (tmp > a[i] % a[j]) { while (tmp > a[i] % a[j]) { j++; } } while (a[i] % a[j + 1] > a[i] % a[j]) { j++; } tmp = a[i] % a[j]; res = max(res, tmp); } cout << res << endl; return 0; }