A + B + C Problem

Description

已知N个不同的数a[1..N]

求能否从这些数中选出不同的三个数ABC,使得他们的和为S

Input

多组数据,每组数据第一行有两个个整数NS(1 <= N <= 1000, 1 <= S <= 3*10^8)

第二行有N个整数a[1], a[2], ..., a[n]。 (1 <= a[i] <= 10^8)

Output

对于每组数据,如果可以,输出”YES”,否则输出”NO”,并换行。

Sample Input

4 6
1 2 3 4
3 5
2 3 4

Sample Output

YES
NO
#include <bits/stdc++.h>  
   
const int N = 1005;  
   
int a[N];  
int n, s;  

//排序后枚举前两个数对第三个数进行二分
int main() {  
    while (~scanf("%d%d", &n, &s)) {  
        for (int i = 0; i < n; ++i) scanf("%d", a + i);  
        std::sort(a, a + n);        //进行排序,利于减少复杂度  
        bool ok = 0;                //用来标记结果  
        for (int i = 0; i < n; ++i) {  
            for (int j = i + 1; j < n; ++j) {       //前俩个数字用枚举  
                int c = s - a[i] - a[j];            //第三个数字就用二分  
                int p = std::lower_bound(a + j + 1, a + n, c) - a;       
        //函数lower_bound()在first和last中的<strong>前闭后开</strong>区间进行二分查找,返回大于或等于val的<strong>第一个元素</strong>位置。如果所有元素都小于val,则返回<strong>last</strong>的位置  
                if (p > j && p < n && a[p] == c) {      //对p进行无误判断  
                    ok = 1;  
                }  
            }  
        }  
        puts(ok == 1 ? "YES" : "NO");     //根据ok,输出结果  
    }  
    return 0;  
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值