题目:

1557 两个集合
题目来源: 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 2147483647int s[100010];map<int, bool> in; // 表示数字没有被使用过,所有的数字都在大集合里 int main(){int n,a,b;cin >> n >> a >> b;for(int i = 0;i < n; i++){cin >> s[i];in[s[i]] = true;}int count = 0;    //记录多少个数字被使用过 while(true){//标记当前循环是否有数字匹配 bool update = false;for(int i = 0;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 += 2;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 += 2;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 += 2;update = true;}}//如果放了n个数字了,说明可以分配 if(count >= n) break;//如果放不够n个数字,而且再也找不到匹配了,说明无法分配 if(!update){cout << "NO" << endl;return 0;}}cout << "YES" << endl;return 0;
} 

51nod 1557 两个集合 (严谨的逻辑题)相关推荐

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

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

  2. ¥1-2 例2.2 将两个集合的并集放到线性表中

    将两个集合的并集放到线性表中 题目描述 样例输入 样例输出 源代码 题目描述 样例输入 2 1 3 3 5 3 7 样例输出 1 3 5 7 源代码 #include<iostream> ...

  3. 两个不相交的闭集并不能保证两个集合可分

    首先, 我们重申以下闭集的定义.如果一个集合的聚点都属于这个集合本身吗,那么这个集合是一个闭集. 比如 [ 0 , 1 ] [0,1] [0,1]就是一个闭集,而 ( 0 , 1 ] (0,1] (0 ...

  4. C++实现顺序表两个集合的并交差集

    给定两个顺序表(代表两个不同的集合),利用顺序表的基本操作实现这两个集合的并集,交集,差集. 运行结果如下图所示: 顺序表的基本操作我在另外一篇文章有讲,对于顺序表的基本操作在这里我就不详细讲了,主要 ...

  5. 问题 A: 第二题(划分一个集合为差值最小的两个子集合)

    题目描述 一个数组中有若干正整数,将此数组划分为两个子数组,使得两个子数组各元素之和a,b的差最小,对于非法输入应该输出ERROR. 输入 数组中的元素 输出 降序输出两个子数组的元素和 样例输入 1 ...

  6. 数组-两个数组的交集(两个集合)

    题意: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...

  7. python两个集合的交集 合集 差集

    python两个集合的交集 合集 差集 https://blog.csdn.net/qq_17753903/article/details/84899612 python & | and or ...

  8. 写if-else不外乎两种场景:异常逻辑处理和不同状态处理。

    写if-else不外乎两种场景:异常逻辑处理和不同状态处理. 参考文章: (1)写if-else不外乎两种场景:异常逻辑处理和不同状态处理. (2)https://www.cnblogs.com/hu ...

  9. 有3个集合, 从其中一个集合中删除同时存在于另外两个集合的元素

    如下分享的邮件,在博客园做个记录,以便以后使用. 在这里,其实也想倡导一下程序员要具有的分享精神.鼓励大家多分享,平时有什么新的收获,最好在team里做个分享 .分享也是一种很好的事情.对团队来说,可 ...

最新文章

  1. matlab智能算法30个案例分析_赞!继电保护25个事故案例分析总结,值得收藏!...
  2. Hibernate 3 入門
  3. 【笔记】与Android选项卡一周
  4. 《系统集成项目管理工程师》必背100个知识点-02项目组织方式和特点
  5. PHP正则表达式大全
  6. ERROR: Resource shrinker cannot be used for libraries报错Android开发之迁移老项目到Android Studio3.0报错的问题解决方法
  7. 【飞秋】OR层代码组织介绍
  8. LockDemo 锁对象
  9. LeetCode-3. 无重复字符的最长子串
  10. C#生成CHM文件(应用篇)
  11. \sbin\nginx:cannot execute binary file
  12. 二级c语言上机题库下载,二级C语言上机题库(全).doc
  13. Cocos2D-x设计模式发掘之二:二段构建模式 -----------cocos2d-x3.0正式版本(7.22)
  14. Teststand: 如何让一个测试步骤不要在报告里生成
  15. PanDownload复活了!60MB/s!
  16. 武汉大学计算机网络安全学院,消息︱武汉大学计算机学院(新)与国家网络安全学院正式组建...
  17. [SugerTangYL] Verilog 语言入门(零基础视角)
  18. LWIP协议栈[I/drv.emac] RxCpltCallback err = -3错误解决办法
  19. 运维学python用不上_数读 | 为什么运维朋友们都需要学Python?
  20. Nginx代理服务器的安装及 开机启动配置

热门文章

  1. 每日程序C语言49-猴子分桃子问题
  2. 2008年浙江大学计算机及软件工程研究生机试真题
  3. 浙商银行2011.11.26校园招聘会笔试题
  4. 中介者模式(Mediator Pattern)
  5. 领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解
  6. oracle database 12cr2 使用 dbms_stat 采集统计信息
  7. Windows Message Queue(优先队列)
  8. Linux iptables 防火墙相关命令介绍及使用
  9. jquery订阅发布插件代码草稿,为jquery扩展jquery.publish,jquery.subscribe方法
  10. Nslookup 命令使用浅析