FAFU OJ 一个简单的问题

89 阅读1分钟

一个简单的问题

Time Limit:1000MSMemory Limit:65536KB
Total Submissions:1386Accepted:240

Share

Description:

      给定N个正整数和一个正整数P,要求你从中找出两个数字a,b使得a + b = p;

Input:

第一行两个数字n,p(n<=10^5;p,n个整数<2^32);第二行n个数字

Output:

若能找到这两个数字输出Yes,否则输出No.

Sample Input:

3 3

1 2 3

4 2

1 3 2 1

1 5

5

Sample Output:

Yes

Yes

No

Source:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long p;
long long num[100005];
int main(void)
{
    int n,i=0,j,flag=0;
    memset(num,0,sizeof(num));
    while(scanf("%d%lld",&n,&p) == 2)
    {
    
        while(n--)
        {
            scanf("%lld",&num[i]);
            if(num[i] >= p) continue;//如果输入的数字大于p,丢掉

            i++;
        }
        n = i;        //n为除去丢弃后剩余的数字个数

        sort(num,num+n);
        for(i=0,j=n-1; i<j;)
        {
            if(num[i]+num[j] > p)       j--;    //大于p说明最右边太大,取小一点,左移

            else if(num[i]+num[j] < p)  i++;    //小于p说明最左边太小,取大一点,右移

            else      {flag = 1;break;}            //相等,找到了 

        }
        if(flag)    printf("Yes\n");
        else        printf("No\n");
        i = flag = 0;
        memset(num,0,sizeof(num));
    }

    return 0;
}


\

\