1421 最大MOD值

基准时间限制:1 秒 空间限制:131072 KB 

有一个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
思路:二分;
找最大的mod,我们先去重,然后循环每个数的倍数,二分找小余倍数的最大的值,这个用筛法,然后更新最大的答案。复杂度n*(logn)^2;
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<stdlib.h>
 6 #include<queue>
 7 #include<iostream>
 8 int ans[300000];
 9 int bns[300000];
10 int ap[1000005];
11 using namespace std;
12 int main(void) {
13     int n;
14     scanf("%d",&n);
15     int i,j;
16     int maxx = 0;
17     for(i = 0; i < n; i++) {
18         scanf("%d",&ans[i]);
19         maxx = max(ans[i],maxx);
20     }
21     sort(ans,ans+n);
22     int cn = 0;
23     bns[cn++] = ans[0];
24     int t =bns[0];
25     for(i = 1; i < n; i++) {
26         if(ans[i]!=t) {
27             t = ans[i];
28             bns[cn++] = t;
29         }
30     }
31     if(n == 1) {
32         printf("0\n");
33     } else {
34         int ask = 0;
35         for(i = cn-1; i >= 0; i--) {
36             if(bns[i]!=1) {
37                 for(j = 2; bns[i]*j <= maxx+bns[i]; j++) {
38                     int l = i+1,r = cn-1;
39                     int id = -1;
40                     while(l <= r) {
41                         int mid = (l+r)/2;
42                         if(bns[mid] < bns[i]*j) {
43                             id = mid;
44                             l = mid + 1;
45                         } else r = mid-1;
46                     }
47                     if(id!=-1) 
48                         ask = max(bns[id]%bns[i],ask);
49                 }
50             }
51             if(ask >= bns[i])break;
52         }
53         printf("%d\n",ask);
54     }
55     return 0;
56 }

 


posted @ 2016-09-07 19:28  sCjTyC  阅读(347)  评论(0编辑  收藏  举报