码迷,mamicode.com
首页 > 编程语言 > 详细

1001 数组中和等于K的数对

时间:2016-05-07 15:00:17      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

1001 数组中和等于K的数对

基准时间限制:1 秒 空间限制:131072 KB
给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对。例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5)。
Input
第1行:用空格隔开的2个数,K N,N为A数组的长度。(2 <= N <= 50000,-10^9 <= K <= 10^9)
第2 - N + 1行:A数组的N个元素。(-10^9 <= A[i] <= 10^9) 
Output
第1 - M行:每行2个数,要求较小的数在前面,并且这M个数对按照较小的数升序排列。
如果不存在任何一组解则输出:No Solution。
Input示例
8 9
-1
6
5
3
4
2
9
0
8
Output示例
-1 9
0 8
2 6
3 5
//二分优化; 
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[50050];
int v[50050];
int n;
int judge(int num)
{
    int l=0, r=n-1;
    while(l <=r)
    {
        int mid= (l+r)>>1;
        if(num== a[mid]) return mid;
        if(num< a[mid])  r= mid-1;
        if(num> a[mid])  l=mid+1;
    }
    return -1;
}
int main()
{
    int k;
    while(scanf("%d%d", &k, &n) != EOF)
    {
        memset(v, 0, sizeof(v));
        for(int i=0; i<n; i++)
            scanf("%d", &a[i]);
        sort(a, a+n);
        int f, s;
        bool flag =0;
        for(int i=0; i< n; i++)
        {
            if(v[i]) continue;
            f=a[i];
            s=k-a[i];
            int index=judge(s);
            if(index != -1 && !v[index])
            {
                if(f==s) continue;
                v[i]=1;
                v[index]= 1;
                flag=1;
                printf("%d %d\n", f, s);
            }
        }
        if(!flag)
            printf("No Solution\n");
    }
    return 0;
}

 

1001 数组中和等于K的数对

标签:

原文地址:http://www.cnblogs.com/ceal/p/5468315.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!