51nod 1557 两个集合(Set)

题意:给你a和b,小X有n个互不相同的整数: p1,p2,...,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。
·        如果x属于A,那么a-x也肯定属于A。

·        如果x属于B,那么b-x也肯定属于B。


思路:

如果a-x,b-x都不存在那么就是A,B都不能放,no。

如果a-x,b-x只存在其中一个,那就是能放。

如果a-x,b-x都存在,如果 x 在 A 中,那么 b-x 一定不在 B 中,因为数唯一,所以 b-x 只能在 A 中,也就是说必须存在 a-(b-x),如果不存在就是no,同理得如果 x 在 B 中,则必须存在 b-(a-x)。


代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int v[maxn], n, a, b;
set<int> s;

int main(void)
{
    while(cin >> n >> a >> b)
    {
        s.clear();
        for(int i = 1; i <= n; i++)
            scanf("%d", &v[i]), s.insert(v[i]);
        bool no = 0;
        for(int i = 1; i <= n; i++)
        {
            int tmp1 = a-v[i];
            int tmp2 = b-v[i];
            if(s.find(tmp1) == s.end() && s.find(tmp2) == s.end()) no = 1;
            if(s.find(tmp1) != s.end() && s.find(tmp2) != s.end())
            {
                if(s.find(a-tmp2) == s.end() && s.find(b-tmp1) == s.end()) no = 1;
            }
        }
        puts(no ? "NO" : "YES");
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值