监控

xiaoxiao2021-02-28  110

某国的安全部门监控了全国的数据流,该部门的程序员接到一个任务,恐怖组织会给手下发送一个数字序列A,其中由n个正整数组成,而其中任何两个值Ai和Aj都可以求它们的余数

x=Ai mod Aj ,(其中1<=i,j<=n,Ai>= Aj)。

所有x中,最大的x就是破译机密的秘钥。程序员的任务就是找到这个最大的x。

输入格式:

第一行是一个正整数n,第二行由n个小于等于10610^6106的正整数组成1 ≤ n ≤ 2·10510^5105

输出格式:

输出找到的最大值。

输入样例:

3 1 3 10

输出样例:

1 思路: 假如ABCDEF,F对E、D依次取余,用 m 记录最大余数, 假如 m > C,则停止内层循环;外循环减一,让E重复该过程,如果没有找到大于M的,也在C处停止,如果找到大于M的,就可以把停止点由C调整到该位置 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[500010]; int main() { int n; int max_mod = -9999; int t; scanf("%d", &n); a[0] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } int m = 1; sort(a+1, a+n+1); for (int i = n; i >= m; i--) { for (int j = i-1; j >= m; j--) { if (a[j] != 0) { t = a[i] % a[j]; max_mod = t > max_mod ? t : max_mod; if (max_mod >= a[j]) { m = j; break; } } } } printf("%d", max_mod); return 0; }
转载请注明原文地址: https://www.6miu.com/read-42263.html

最新回复(0)