Bootstrap

51Nod - 1001(数组中和等于K的数对)

值得学习的是lower_bound的用法,作用是寻找数组中第一个大于等于某个数的位置,返回的是位置的地址,减去头地址后返回的是数组的下标。

使用形式:int p=lower_bound(a,a+n,ans)-a;

(1)p就是数组a中大于等于ans这个数字的第一个元素的下标。

(2)a是数组名或数组首地址,a,a+n指的是查找的地址范围。ans是目标的数字。 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50005;
int num[maxn];
int n,k;
int main()
{
    int flag=1;
    scanf("%d%d",&k,&n);
    for(int i=0; i<n; i++)
        scanf("%d",&num[i]);
    sort(num,num+n);
    for(int i=0; i<n; i++)
    {
        int ans=k-num[i];
        int p=lower_bound(num,num+n,ans)-num;
        if(num[p]==ans)
        {
            if(p<=i)
                break;
            printf("%d %d\n",num[i],num[p]);
            flag=0;
        }
    }
    if(flag)
        printf("No Solution\n");
    return 0;
}

 

;