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就 ...
随机推荐
- Route学习笔记
前言 UrlRoutingModule.class:这块的代码关联了上一篇中路由部分的一个详细说明 一:Route的讲解 1. 路由模板匹配 添加路由: MapRoute 剔除的路由:IgnoreRo ...
- xbox 相关
https://live.xbox.com/zh-CN/avatareditor xboxgames://
- Temporary Tables临时表
1简介 ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据, 或者保存在一个事务中需要的数据.当会话退出或者用户提 ...
- Codeforces Round #282 (Div. 2) A
解题思路:用数组将每一个显示数字可能表示的数字种数存储起来即可 反思:第一次做的时候没有做出来是因为题意理解错误,第二次WA是因为情况没有考虑完全,1对应有7个数字,5对应有4个数字 A. ...
- 大数乘法 poj2389
Bull Math Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14972 Accepted: 7695 Descri ...
- 利用cookie判断文件下载完成
在网页下载文件时,该文件又是通过后台代码生成的,比如报表之类的.当需要生成文件过大时会耗费很多时间,而文件生成好传到页面的时候也没有事件可以监听它,像微软官网,谷歌,百度等下载方式都是通过提示五秒过后 ...
- [USACO18JAN] MooTube (离线并查集)
题目大意:给你一棵边权树,定义两点间距离为它们唯一路径上的最小路权,求与某点距离不大于K(k为已知)的点的数量 带权并查集维护集合内元素总数 路和问题 都按权值大到小排序,枚举问题, 建权值不小于K的 ...
- Android开发进度02
1,今日:目标:创建第一个android项目,创建android虚拟机 2,昨天:完成eclipseandroid环境的搭建 3,收获:修改.xml文件,将出错地方解决 4,问题:版本问题
- Docker决战到底(三) Rancher2.x的安装与使用 - 简书
原文:Docker决战到底(三) Rancher2.x的安装与使用 - 简书 image.png 当越来越多的容器化应用被部署,一个可以管理编排这些容器的工具此时就显得尤为重要了.目前容器编排领域 ...
- Ajax原理-重点
Ajax原理 AJAX即“Asynchronous Javascript And XML”,是指一种创建交互式网页应用的网页开发技术.AJAX 是一种用于创建快速动态网页的技术.它可以令开发者只向服务 ...