题目:

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

小X有n个互不相同的整数: p1,p2,...,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。

·        如果x属于A,那么a-x也肯定属于A。

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

判断一下是否存在一种方案来分配这些数字到集合A,B中。

注意:如果一个集合为空也是可以的。

Input
单组测试数据。
第一行有三个整数n,a,b (1≤n≤10^5; 1≤a,b≤10^9)。
第二行有n个不一样的整数 p1,p2,...,pn (1≤pi≤10^9).
Output
如果可行,那么输出YES,否则输出NO。
Input示例
样例输入1
4 5 9
2 3 4 5
Output示例
样例输出1
YES 题意很清楚就是把所有的数字按要求分在A,B集合中,看是否能全部分完。 看似很简单,但是有很多坑点,需要把所有的逻辑都想清楚再下笔。 解法:
    首先我们看到这道题肯定会想到二分图的解法。
    二分图是相邻的点要染成不同色,看是否能把整个图只用两种颜色染色。
    这道题是相邻的点(a[i]+a[j]==A || a[i]+a[j]==B)要染成同色,看是否能用两种颜色表示。(注意的是两种颜色可能相同(A == B))
    但是和二分图很不同的是,当一个点可以在A中而且可以在B中时,用二分图的逻辑有点行不通了。   所以我们换个思路:
    
    当某个点只能存在A中/只能存在于B中时,我们就把这个点和与之匹配的点(A-a[i]/B-a[i])放在A/B中。
    一趟一趟的扫所有的点,如果某一次没有能放在A/B中的点了,
      1.n个点中还有点没有被放在A/B中,那就不能分完,输出NO。
      2.n个点全部放在A/B中了,那就能分完,输出YES。     注意的就是如果A == B,可能会陷入死循环,需要特殊处理A == B,直接看是否能将全部点放在A/B中就可以。 代码:
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <math.h>
#include <queue>
using namespace std;
typedef long long ll;
#define INF 2147483647 int s[]; map<int, bool> in; // 表示数字没有被使用过,所有的数字都在大集合里 int main(){
int n,a,b;
cin >> n >> a >> b;
for(int i = ;i < n; i++){
cin >> s[i];
in[s[i]] = true;
} int count = ; //记录多少个数字被使用过 while(true){
//标记当前循环是否有数字匹配
bool update = false; for(int i = ;i < n; i++){
if(!in[s[i]]) continue; //这个数字被使用过了,不再计算
if(in[a-s[i]] && !in[b-s[i]]){
//在A集合中能找到匹配对象,B集合中找不到,一定要放在A集合中
in[a-s[i]] = false;
in[s[i]] = false;
count += ;
update = true;
}else if(!in[a-s[i]] && in[b-s[i]]){
//在B集合中能找到匹配对象,A集合中找不到,一定要放在B集合中
in[b-s[i]] = false;
in[s[i]] = false;
count += ;
update = true;
}else if(in[a-s[i]] && in[b-s[i]] && a == b){
//如果a == b,全部放在一个集合中就可以了
in[a-s[i]] = false;
in[s[i]] = false;
count += ;
update = true;
}
}
//如果放了n个数字了,说明可以分配
if(count >= n) break;
//如果放不够n个数字,而且再也找不到匹配了,说明无法分配
if(!update){
cout << "NO" << endl;
return ;
}
}
cout << "YES" << endl;
return ;
}

51nod 1557 两个集合 (严谨的逻辑题)的更多相关文章

  1. 51Nod 1557 两个集合(二分)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1557 题意: 小X有n个互不相同的整数: p1,p2,...,pn .他 ...

  2. java求两个集合的交集和并集,比较器

    求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...

  3. 求两个集合的交集和并集C#

    我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...

  4. 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象

    本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...

  5. 计算两个集合的差集——第六期 Power8 算法挑战赛

    第六期Power8大赛 1.1 比赛题目 题目: 计算两个集合的差集: 详细说明: 分别有集合A和B两个大数集合,求解集合A与B的差集(A中有,但B中无的元素),并将结果保存在集合C中,要求集合C中的 ...

  6. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  7. C# 判断两个集合(List)是否相等

    1.两个list如果有重复元素(如List1: a,b,a  List2: b,b,a) 是无法通过包含关系来判断是否相等的. 有两个办法,其一是两个List排序后再按顺序比较.另一个办法就是计算各元 ...

  8. 关于Linq对DataTable和List各自的两个集合筛选的相关操作技巧

    项目中用到了对两个集合的帅选等操作,简单总结下 1.Linq操作多个Datable 可以通过AsEnumerable()方法对DataTable进行Linq操作 //获取数据表所有数据 DataTab ...

  9. Java 单个集合去重与两个集合去重

    一.单个集合去重 描述: 去掉一个集合里重复的元素:将list集合转成hashSet集合,hashSet有自动去重的功能,再利用去重后的hashSet集合初始化一个新的list集合,此时这个list就 ...

随机推荐

  1. 编写高质量的Makefile

    源地址 :http://blog.csdn.net/maopig/article/details/6801749 一.前言 回想自己的第一个Makefile,是这个样子的 CODE hello:hel ...

  2. 继承TabActivity后不执行onBackPressed()里的方法

    // 用下面这个函数拦截子Activity的返回操作        @Override        public boolean dispatchKeyEvent(KeyEvent event) { ...

  3. 通过配置host,自定义域名让本地访问

    最近服务器这块一直由我来维护,我们开发的项目很多域名根本没有解析,而是仅仅配置了host,就可以本地访问服务器了.感觉很有意思,于是乎,打算试一试.结果弄了许久,最后第二天才解决了.把这个艰辛的旅程记 ...

  4. windows服务更改配置文件

    现场部署的服务所在文件夹内容如上图所示,由于现场数据库服务器更改了IP,所以我服务里的数据库连接字符串也需要修改(注意到日志文件,从某天改了IP后就再也连不上数据库了) 修改过程: 1.打开服务管理, ...

  5. addFooterView(v)与 addHeaderView(v)之后 头或者尾部没有加上去

    myExpandableListView.addHeaderView(headView); myExpandableListView.addFooterView(footerView); 原因很简单: ...

  6. pip快速下载安装python 模块module

    g刚开始学习python时,每次想要安装某个module,都到处找module的安装包(exe.whl等) 装setuptools,然后在cmd里用easy_install装pip,然后用pip装你要 ...

  7. POST和GET详解

    GET和POST Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上 ...

  8. CSS布局总结(一)

    前言:今天是学校为期六周的实训第一天,实训课感觉很水,第一天讲的竟然是HTML...实训老师丢了一个静态页面给我们做.感觉很久没写过这种东西,突然觉得自己的基本功很渣.布局这方面感觉需要总结一下,然后 ...

  9. django-4-模板标签,模板继承

    <<<模板标签>>> {% for %}{% endfor %} 循环 {% if %}{% elif %}{% else %}{% endif %} 判断 {% ...

  10. Win10和子系统Ubuntu简单共享

    Win10和子系统Ubuntu简单共享 C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp ...