一个简单的问题
| Time Limit: | 1000MS | Memory Limit: | 65536KB |
|---|---|---|---|
| Total Submissions: | 1386 | Accepted: | 240 |
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;
}
\
\