1384.卡片游戏


时间限制: 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;
}