zoukankan      html  css  js  c++  java
  • bestcoder#43 1002 在数组中找两个数的和取模的最大值 二分

    bestcoder#43 1002 在数组中找两个数的和取模的最大值  二分

    pog loves szh II

     
     Accepts: 97
     
     Submissions: 834
     Time Limit: 4000/2000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    Problem Description

    Pog and Szh are playing games. There is a sequence with n numbers, Pog will choose a number A from the sequence. Szh will choose an another number named B from the rest in the sequence. Then the score will be (A+B) mod p. They hope to get the largest score. And what is the largest score?

    Input

    Several groups of data (no more than 5 groups,n1000).

    For each case:

    The following line contains two integers,n(2n100000)p(1p2311)

    The following line contains n integers ai(0ai2311)

    Output

    For each case,output an integer means the largest score.

    Sample Input
    4 4
    1 2 3 0
    4 4
    0 0 2 2
    Sample Output
    3
    2
    题意:给定数组a和整数p,在数组中找出两个数A,B,使(A+B)%p最大,输出最大值。
    思路:对所有输入的数取模,排序,这时对任意两个在数组中的数A,B,有0<=A<=p-1,0<=B<=p-1,即0<=A+B<=2*p-2,因此(A+B)%p最大时有两种情况,即A+B<P,A+B小于但最接近P时最大,另一种是A+B>p,即A+B小于但最接近于2*p时最大。移项,固定A,查找小于p-A的第一个数以及小于2*p-A的第一个数,取最优的即可。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<set>
    #include<map>
    #include<string>
    #include<math.h>
    #include<cctype>
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=(1<<29);
    const double EPS=0.0000000001;
    const double Pi=acos(-1.0);
    
    ll n,p;
    ll a[maxn];
    
    ll bin_search(int left,int right,ll key)
    {
        while(left<=right){
            int mid=(left+right)/2;
            //cout<<left<<" "<<right<<" "<<mid<<endl;
            if(a[mid]>key) right=mid-1;
            else if((mid==n&&a[mid]<=key)||(a[mid+1]>key&&a[mid]<=key)) return a[mid];
            else left=mid+1;
        }
        return -INF;
    }
    
    int main()
    {
        while(cin>>n>>p){
            for(int i=1;i<=n;i++){
                scanf("%I64d",&a[i]);
                a[i]%=p;
            }
            sort(a+1,a+n+1);
            ll ans=0;
            for(int i=1;i<=n-1;i++){
                ll x=bin_search(i+1,n,p-a[i]);
                ll y=bin_search(i+1,n,2*p-a[i]);
                //cout<<"i+1="<<i+1<<" p-a[i]="<<p-a[i]<<endl;
                //cout<<"x="<<x<<" y="<<y<<endl;
                ll t=max((x+a[i])%p,(y+a[i])%p);
                if(t>ans) ans=t;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    Python os.getcwd()方法
    Python os.walk()方法
    PyTorch 模型构造
    Python map()函数
    字符串转数字测试--知识备忘
    如何判断一个变量是数组Array类型--实例--加个人见解
    js面试题
    ios学习笔记
    读取图片文件--实例
    名言记录
  • 原文地址:https://www.cnblogs.com/--560/p/4561649.html
Copyright © 2011-2022 走看看