51Nod1421 最大MOD值

Problem

有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。

Solution

遍历模数,枚举倍数,对于每一个倍数,找到比倍数小的最大值。这个最大值之前预处理出来,注意细节。

Code

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
#define db double
#define ll long long
inline int rd(){
	int x=0;
	char ch=0;
	while(ch<'0'||ch>'9') {ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x;
}
int n,a[200020],mx,ans;
int f[1000020];
int main(){
	//io_opt;
	n=rd();
	for(int i=1;i<=n;i++){
		a[i]=rd();
		mx=max(mx,a[i]);
	}
	sort(a+1,a+1+n);
	n=unique(a+1,a+1+n)-(a+1);
	a[n+1]=1000000;
	for(int i=1;i<=n;i++){
		for(int j=a[i]+1;j<=a[i+1];j++){
			f[j]=a[i];
		}
	}
	for(int i=1;i<=n;i++){
		for(int k=2;;k++){
			int sum=k*a[i]>1000000?mx:f[k*a[i]];
			ans=max(ans,sum%a[i]);
			if(k*a[i]>1000000) break;
		}
	}
	printf("%d
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/sz-wcc/p/12796440.html