有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ,使得 最大并且 。
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 ",ans); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。