【51Nod1421】最大MOD值

来源:互联网 发布:油画 知乎 编辑:程序博客网 时间:2024/06/01 09:00

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

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

题解
类似于筛法,对于一个数x,我们要在x*i ~ x*(i+1) 这段区间中找最大值。
去重后,用二分。

代码

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<set>#include<ctime>#include<vector>#include<cmath>#include<algorithm>#include<map>#include<queue>#define mod 20101009#define ll long long #define N 10000005 using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int n,a[200005],mx;int main(){    n=read();    for (int i=0;i<n;i++) a[i]=read();    sort(a,a+n);    n=unique(a,a+n)-a;    for (int i=0;i<n;i++)    {        for (int j=a[i]<<1;j<=a[n-1];j+=a[i])        {            int p=lower_bound(a,a+n,j)-a;            if (p) mx=max(mx,a[p-1]%a[i]);        }        mx=max(mx,a[n-1]%a[i]);    }    printf("%d",mx);    return 0;}
原创粉丝点击