51nod 1557 两个集合 (严谨的逻辑题)
题目:
小X有n个互不相同的整数: p1,p2,...,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。
· 如果x属于A,那么a-x也肯定属于A。
· 如果x属于B,那么b-x也肯定属于B。
判断一下是否存在一种方案来分配这些数字到集合A,B中。
注意:如果一个集合为空也是可以的。
单组测试数据。
第一行有三个整数n,a,b (1≤n≤10^5; 1≤a,b≤10^9)。
第二行有n个不一样的整数 p1,p2,...,pn (1≤pi≤10^9).
如果可行,那么输出YES,否则输出NO。
样例输入1
4 5 9
2 3 4 5
样例输出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 两个集合 (严谨的逻辑题)的更多相关文章
- 51Nod 1557 两个集合(二分)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1557 题意: 小X有n个互不相同的整数: p1,p2,...,pn .他 ...
- java求两个集合的交集和并集,比较器
求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
- 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
本文需要对C#里的LINQ.Lambda 表达式 .委托有一定了解. 在工作中,经常遇到需要对比两个集合的场景,如: 页面集合数据修改,需要保存到数据库 全量同步上游数据到本系统数据库 在这些场景中, ...
- 计算两个集合的差集——第六期 Power8 算法挑战赛
第六期Power8大赛 1.1 比赛题目 题目: 计算两个集合的差集: 详细说明: 分别有集合A和B两个大数集合,求解集合A与B的差集(A中有,但B中无的元素),并将结果保存在集合C中,要求集合C中的 ...
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
c#封装DBHelper类 public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...
- C# 判断两个集合(List)是否相等
1.两个list如果有重复元素(如List1: a,b,a List2: b,b,a) 是无法通过包含关系来判断是否相等的. 有两个办法,其一是两个List排序后再按顺序比较.另一个办法就是计算各元 ...
- 关于Linq对DataTable和List各自的两个集合筛选的相关操作技巧
项目中用到了对两个集合的帅选等操作,简单总结下 1.Linq操作多个Datable 可以通过AsEnumerable()方法对DataTable进行Linq操作 //获取数据表所有数据 DataTab ...
- Java 单个集合去重与两个集合去重
一.单个集合去重 描述: 去掉一个集合里重复的元素:将list集合转成hashSet集合,hashSet有自动去重的功能,再利用去重后的hashSet集合初始化一个新的list集合,此时这个list就 ...
随机推荐
- Python 函数(二)
参数 以下是调用函数时可使用的正式参数类型: 必备参数 关键字参数 默认参数 不定长参数 必备参数 必备参数须以正确的顺序传入函数.调用时的数量必须和声明时的一样. 调用printme()函数,你必须 ...
- marge into操作
动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...
- ifame子页实现父页面刷新(或跳转到指定页面)
<script>parent.location.replace('../D_DailyManager/Add.aspx?id=" + x + "');</scri ...
- Fildder 4接口测试工具Post请求方式
- ES6的基本语法
ES6 详细参考页面 简介 ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现.一般来说,这两个词是可以互换的. let命令 ES6新增了let命令,用来声明变 ...
- ddk安装失败后的处理
7600.16385.1版本的DDK,在xp的本上死活按不上,怎么办呢?自己就把其他机器上安装的DDK目录,拷贝过来. 怎么建编译环境呢? 查看x86 Checked Build Environmen ...
- Eclipse键盘输出文字,显示到屏幕上方法
方法1 /*标准的思路: * 分析: * 1.来源 * 键盘:System.in * 2.目的地 * 屏幕:System.out * 文件:FIle * 3.分别分析:源,目的地流的类型(字符,字节) ...
- 聊聊 TCP 中的 KeepAlive 机制
KeepAlive并不是TCP协议规范的一部分,但在几乎所有的TCP/IP协议栈(不管是Linux还是Windows)中,都实现了KeepAlive功能 RFC1122#TCP Keep-Alives ...
- C/C++函数调用约定与this指针
关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的. VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调 ...
- vue自定义组件并使用
以下是使用自己写的一个简单的文件上传框为例 1.自定义组件结构(一个js文件,一个vue文件),最好单独放一个文件 2.upload.vue 内容 其中,action是父组件传递给子组件的参数,使用p ...