时间限制: 1000 MS 内存限制: 65536 K
提交数: 482 (0 users) 通过数: 256 (249 users)
问题描述
这一天,小明他们玩了一个游戏。每个人手中有n张卡片,每一张卡片上有一个整数,接着裁判给出一个整数k,然后每一个人需要选择两张卡片使得两张卡片上的数字之和为k,如果可以出卡片,那么打出这两张卡片。如果不行,那么就该下家出卡片。谁先出完卡片谁就是赢家。现在轮到小明出卡片了,不过由于卡片较多且卡片上数据较大,小明尽可能要在最短时间内决定能不能出卡片,因为其他玩家已经在嚷嚷“快点啊,我等得花儿都谢了!”
输入格式
第一行输入两个整数n、k,2<=N<=1000,0<K<=2,000,000,000。
第二行输入n个整数ai (0<ai<=1,000,000,000),代表n张卡片上的数。
输出格式
为了简单起见,(因为两张卡片数字之和为k的组合可能有多种)如果可以出卡片,则输出“Yes”;如果不能出卡片,则输出“No”(无引号)
样例输入
5 10
4 5 6 2 1
样例输出
Yes
来源
xmu
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
int n, k;
int a[1005] = { 0 };
int i, j;
int is_found;
scanf("%d %d", &n, &k);
for (i = 0; i < n; ++i)
scanf("%d", &a[i]);
qsort(a, n, sizeof(a[0]), cmp);
i = 0;
j = n - 1;
is_found = 0;
while (i < j)
{
if (a[i] + a[j] == k)
{
is_found = 1;
break;
}
else if (a[i] + a[j] < k)
++i;
else
--j;
}
if (is_found)
printf("Yes\n");
else
printf("No\n");
return 0;
}