51nod 1421 最大MOD值

分析:首先去重排序,然后枚举a[i]的倍数,找到最大的a[j],使得a[j]小于a[i]的倍数,用二分法找,然后更新一下最大值。枚举a[i]和倍数复杂度为O(nlogn),二分O(logn),总的为O(n(logn)^2)。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=200005;
 6 int a[maxn],n;
 7 bool have[5*maxn];
 8 inline int Dich(int t,int l){
 9     if(a[n-1]<=t)return a[n-1];
10     if(a[l]>t)return a[l-1];
11     int r=n-1,m=(r+l)/2;
12     while(l<r&&l!=m){
13         if(a[m]==t)return a[m];
14         if(a[m]>t)r=m;
15         else l=m;
16         m=(l+r)/2;
17     }
18     return a[m];
19 }
20 int main(){
21     cin>>n;
22     int v;
23     memset(have,0,sizeof(have));
24     for(int i=0;i<n;i++){
25         cin>>v;
26         if(have[v]){
27             n--;i--;
28             continue;
29         }
30         a[i]=v;
31         have[v]=true;
32     }
33     sort(a,a+n);
34     int ans=0;
35     for(int i=0;i<n;i++){
36         int t=a[i]*2;
37         do{
38             int k=Dich(t-1,i+1)%a[i];
39             if(k>ans)ans=k;
40         }while((t+=a[i])<=a[n-1]);
41     }
42     cout<<ans<<endl;
43     return 0;
44 }
原文地址:https://www.cnblogs.com/7391-KID/p/7071784.html