1. 程式人生 > >51nod 1421 最大MOD值

51nod 1421 最大MOD值

.cn max eof bsp names mem col have nbsp

技術分享

分析:首先去重排序,然後枚舉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 }

51nod 1421 最大MOD值