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!
  • 相关阅读:
    Entity SQL 初入
    ObjectQuery查询及方法
    Entity Framework 的事务 DbTransaction
    Construct Binary Tree from Preorder and Inorder Traversal
    Reverse Linked List
    Best Time to Buy and Sell Stock
    Remove Duplicates from Sorted Array II
    Reverse Integer
    Implement Stack using Queues
    C++中const限定符的应用
  • 原文地址:https://www.cnblogs.com/--560/p/4561649.html
Copyright © 2011-2022 走看看