BC 61 Numbers

来源:互联网 发布:java messagedigest 编辑:程序博客网 时间:2024/06/01 09:26

Numbers


Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/262144 K (Java/Others)
问题描述
给n个数A1,A2....An{A}_{1},{A}_{2}....{A}_{n},从中选3个位置不同的数A,B和C,问是否有一种情况满足A-B=C.
输入描述
输入有多组数据,不超过1000组.每组数据第一行包含一个整数n,随后一行n个整数A1,A2....An.(3≤n≤100,0≤Ai≤10000\leq {A}_{i}\leq 10000)
输出描述
对于每组数据如果符合条件输出"YES",否则输出"NO".
输入样例
33 1 231 0 241 1 0 2
输出样例
YESNOYES

先排序然后从大到小枚举i,把右边的数用一个数组标记其出现过,

再枚举左边的数判断其加上Ai是否出现过.

这道题题解是采用的数组进行标记的,我是用枚举+二分查找。

#include <stdio.h>#include <algorithm>const int maxn = 1005;int a[maxn];inline int Max ( int a, int b ){    return a > b ? a : b;}int binary_search ( int k, int l, int r, int s, int pos ){    int m;  //采用二分求下界的方法,然后不能是下标s和pos    while ( l < r )    {        m = l+( r-l )/2;        if ( a[m] == k && m != s && m != pos )            return 1;        if ( a[m] >= k )            r = m;        else            l = m+1;    }    return 0;}int main ( ){    int n, cnt, flag;    while ( ~ scanf ( "%d", &n ) )    {        for ( int i = 0; i < n; i ++ )            scanf ( "%d", &a[i] );        std :: sort ( a, a+n );        flag = 1;        for ( int i = 0; i < n && flag; i ++ )  //枚举两层查找        {            for ( int j = 0; j < n && flag; j ++ )            {                if ( i == j )                    continue ;                if ( binary_search ( a[i]-a[j], 0, n-1, i, j ) )                    flag = 0;            }        }        printf ( flag ? "NO\n" : "YES\n" );    }    return 0;}/*0 0*/



0 0
原创粉丝点击