51nod 1421:最大MOD值

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

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


Input
单组测试数据。
第一行包含一个整数n,表示数组a的大小。(1 ≤ n ≤ 2*10^5)
第二行有n个用空格分开的整数ai (1 ≤ ai ≤ 10^6)。
Output
输出一个整数代表最大的mod值。
Input示例
3
3 4 5
Output示例
2

再一次觉得51nod与codeforces上的题目趣味性很浓很有意思,这题一看5级的算法题的话,想一想暴力就一定要TLE。。。

所以就一直没能想出好的方法,看了别人的思路之后才发现很有趣(对,我就是这么弱啊。。。)

5 6 7 8 9这样的序列只对于5来说的话,求对5的mod最大值,会发现其实并不需要求6%5,7%5,8%5,我只需要求5和10之间最大的那一个就可以,如果还有更大的就求10到15之间最大的,以此类推下去。

所以这道题也是这样,不用逐一暴力,只需对每一个Ai,挑选合适的Aj就好,时间就能省下来了。

代码:

#include <cmath> 
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,a[200048]={0},ans=0;

int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;++i) scanf("%d",&a[i]);
	sort(a,a+n);
	for(int i=0;i<n-1;++i)
		if(i==0||a[i]!=a[i-1])
		{
			int j=a[i]+a[i],p;
			while(j <= a[n-1])
			{
				p = lower_bound(a,a+n,j)-a;
				if(p > 0) ans=max(ans,a[p-1]%a[i]);
				j+=a[i];
			}
			ans=max(ans,a[n-1]%a[i]);
		}
	printf("%d\n",ans);
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-08-03 11:09  光速小子  阅读(205)  评论(0编辑  收藏  举报

导航