关闭

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

标签: HDU 二分查找
735人阅读 评论(0) 收藏 举报
分类:

【题目链接】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
*/


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

1.问题描述  写一个高效的算法,从一个m×nm\times n的整数矩阵中查找出给定的值,矩阵具有如下特点:    每一行从左到右递增。 每一列从上到下递增。 2. 方法与思路2.1 二分查找法 ...
  • Jeanphorn
  • Jeanphorn
  • 2015-07-23 20:41
  • 3106

hdu 5676 ztr loves lucky numbers(BC——暴力打表+二分查找)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 ztr loves lucky numbers Time Limit: 2000...
  • qiqi_skystar
  • qiqi_skystar
  • 2016-05-02 21:22
  • 3911

HDU3567:Eight II(康拓展开+预处理)

Problem Description Eight-puzzle, which is also called "Nine grids", comes from an old game.  ...
  • libin56842
  • libin56842
  • 2014-07-21 16:32
  • 3296

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
  • 367

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

pog loves szh II                                      ...
  • qq1319479809
  • qq1319479809
  • 2015-10-09 20:05
  • 221

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

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

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

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

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

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

hdu 5266 pog loves szh III(LCA)

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

hdu 5266 pog loves szh III LCA+RMQ

题意: 给你一棵树,然后询问l~r节点的最近公共祖先(LCA)。 思路: 用RMQ维护一段区间的LCA,然后询问时,将两个区间的LCA再求一次LCA即可。 code: #pragma com...
  • u011580493
  • u011580493
  • 2015-06-19 14:05
  • 263
    个人资料
    • 访问:533965次
    • 积分:11460
    • 等级:
    • 排名:第1559名
    • 原创:535篇
    • 转载:24篇
    • 译文:75篇
    • 评论:90条
    自我简介
    nyist计科13级本科,bjtu17级在读硕士,喜爱算法,热爱编程,欢迎一起学习交流。
    博客专栏