HDU 5265 pog loves szh II (二分查找)

原创 2015年07月07日 13:49:31

【题目链接】click here~~

【题目大意】在给定 的数组里选两个数取模p的情况下和最大

【解题思路】:

思路见官方题解吧~~

弱弱献上代码:

View Code
Problem : 5265 ( pog loves szh II )     Judge Status : Accepted
RunId : 13961817    Language : G++    Author : javaherongwei
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e6;
__int64 num[N],n,m,p,k,ans,cnt,sum;
int my_pow(int a,int n,int mod)
{
    int ans=a,tmp=1;
    while(n)
    {
        if(n&1) tmp*=ans;
        ans*=ans%mod;
        n>>=1;
    }
    return tmp;
}
int main()
{
    while(~scanf("%I64d%I64d",&n,&p))
    {
        for(int i=0; i<n; ++i)
        {
            scanf("%I64d",&num[i]);
            num[i]%=p;
        }
        sort(num,num+n);
        __int64 maxx=(num[n-1]+num[n-2])%p;///第二种情况最大值
        __int64 maxx2;
        for(int i=0; i<n; ++i)
        {
            maxx2=upper_bound(num,num+n,p-num[i]-1)-num-1;
                if((num[i]+num[maxx2])<p&&(maxx2>i))
                maxx=max((num[i]+num[maxx2])%p,maxx);
        }
        printf("%I64d\n",maxx);
    }
    return 0;
}
/*
由于序列中的数可能超过P,所以将所有的数读入后进行取模操作。
之后将取模后的所有数从小到大排序。题目要求我们求不同位置的两个数的和在取模意义下的最大值,
而现在所有数都是小于P且排好序的。因此设我任意选了两个数是X和Y,显然0≤X+Y≤2P−2。
若X+Y<P,则这次选数的答案就是X+Y,若X+Y≥P,则答案是X+Y−P。
那么我们可以这样做:将其中最大的两个数字相加取模,设为一个可能的答案记录在ANS中。
这个答案是第二种情况的最大值。再对排序好的序列进行枚举,对每个枚举到的数,
找出最大的数,使这个数与枚举到的数相加后的和最大且小于P,将之记为可能的答案并于之前找到的最大值ANS进行比较。
这个答案是第一种情况中的可能的最大值。而普通的枚举是要超时的,但是我们发现如果从小到大枚举第一个数,
那么另一个匹配的数显然是从大到小的,因此可以用一个NOW记录当前另一个匹配的数的位置,
每次枚举时NOW递减至符合条件。可以做到O(n)的时间复杂度。
综上所述,时间复杂度为快速排序的O(nlogn),空间复杂度为O(n)。注意一些特殊情况如同一个位置不能多次选。

4 4
1 2 3 0
4 4
0 0 2 2
Sample Output
3
2
*/


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

相关文章推荐

BestCoder Round #43 HDU5265 pog loves szh II 排序+贪心

pog loves szh II                                                                    Time Limit: 400...

hdu 5265 pog loves szh II

pog loves szh II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)...
  • stffer
  • stffer
  • 2015年07月07日 23:09
  • 330

【HDU】5275 pog loves szh IV【拉格朗日插值法】

传送门:【HDU】5275 pog loves szh IV题目分析:首先,队友给了我一个拉格朗日插值法的公式,裸的OWO,如下: ∑i=lr{yi∏i!=j(xi−xj)∏i!=j(x−xj)}\...

hdu 5267 pog loves szh IV(点分治+线段树)

好久之前写的题了。现在要重新开始写题解了。就从这题开始吧。 题意:一棵树,两点之间的权值为路径上的值异或得到,求任意两点之间的权值和,有修改操作,每次都要输出任意两点间的权值和。 做法:当时写这题写了...

HDU 5266 pog loves szh III (线段树+在线LCA转RMQ)

题目地址:HDU 5266 这题用转RMQ求LCA的方法来做的非常简单,只需要找到l-r区间内的dfs序最大的和最小的就可以,那么用线段树或者RMQ维护一下区间最值就可以了。然后就是找dfs序最大的...

hdu 5266 pog loves szh III LCA+RMQ

题意: 给你一棵树,然后询问l~r节点的最近公共祖先(LCA)。 思路: 用RMQ维护一段区间的LCA,然后询问时,将两个区间的LCA再求一次LCA即可。 code: #pragma com...

【HDU】5267 pog loves szh IV【动态点分治】

传送门:【HDU】5267 pog loves szh IV 题目分析:首先我们用树分治,对每一个分治重心,以此为根的子树,建立一棵线段树。可以发现总节点数只有$O(NlogN)$,因为每一层都...

hdu 5266 pog loves szh III(LCA)

题意:求编号l-r的lca。 做法:第一种方法是维护一个类似rmq的东西,因为abcd的lca,可以由ab的lca和cd的lca的lca得到,然后重叠也没有关系,就比如刚才的例子,abcd的lca也...

hdu 5086 NanoApe Loves Sequence 【二分查找】

NanoApe Loves Sequence Ⅱ    Accepts: 374    Submissions: 946  Time Limit: 4000/2000 MS (Java/Others...

HDU - 3081 Marriage Match II(最大流+并查集+二分查找)

点击查看原题 题目大意:一个(很恶俗的)交友游戏,男女搭配,女生选男生,选择的规则是可以选自己认可的也可以选自己的朋友(朋友的朋友,朋友的朋友的朋友)认可的。每轮可以选一个,并且下轮不能选已经被自己...
  • HHH_go_
  • HHH_go_
  • 2017年01月13日 13:56
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5265 pog loves szh II (二分查找)
举报原因:
原因补充:

(最多只允许输入30个字)