zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    	return 0;
    }



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

  • 相关阅读:
    优启通(UEFI版)重装系统
    Beta阶段项目总结
    第二个阶段团队绩效管理
    第二阶段冲刺10天 第十天
    第二阶段冲刺10天 第九天
    第二阶段冲刺10天 第八天
    第二阶段冲刺10天 第七天
    第二阶段冲刺10天 第六天
    第二阶段冲刺10天 第五天
    第二阶段冲刺10天 第四天
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4785797.html
Copyright © 2011-2022 走看看