51Nod 1557 两个集合(二分)
2017-04-12 21:51
239 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1557
题意:
小X有n个互不相同的整数: p1,p2,...,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。
· 如果x属于A,那么a-x也肯定属于A。
· 如果x属于B,那么b-x也肯定属于B。
判断一下是否存在一种方案来分配这些数字到集合A,B中。
注意:如果一个集合为空也是可以的。
思路:
先排序然后一个一个分析过去,用二分法查找对应的数。
一开始的时候考虑的不够仔细,就是说如果a-x和b-x都存在的话,就必须得进一步的分析,因为x只能和其中一个数在一个集合中。所以在这种情况下还需要判断一下b-(a-x)和a-(b-x)的情况,只要其中一个能找到那就可以。
题意:
小X有n个互不相同的整数: p1,p2,...,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。
· 如果x属于A,那么a-x也肯定属于A。
· 如果x属于B,那么b-x也肯定属于B。
判断一下是否存在一种方案来分配这些数字到集合A,B中。
注意:如果一个集合为空也是可以的。
思路:
先排序然后一个一个分析过去,用二分法查找对应的数。
一开始的时候考虑的不够仔细,就是说如果a-x和b-x都存在的话,就必须得进一步的分析,因为x只能和其中一个数在一个集合中。所以在这种情况下还需要判断一下b-(a-x)和a-(b-x)的情况,只要其中一个能找到那就可以。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; const int maxn=1e5+5; int n,a,b; int c[maxn]; bool solve(int num) { int L=1,R=n; while(L<=R) { int mid=(L+R)/2; if(c[mid]>num) R=mid-1; else if(c[mid]<num) L=mid+1; else return true; } return false; } int main() { //freopen("D:\\input.txt","r",stdin); while(~scanf("%d%d%d",&n,&a,&b)) { for(int i=1;i<=n;i++) scanf("%d",&c[i]); sort(c+1,c+n+1); for(int i=1;i<=n;i++) { bool A=solve(a-c[i]); bool B=solve(b-c[i]); if(!A && !B) { printf("NO\n"); return 0; } if(A && B) { bool C=solve(b-(a-c[i])); bool D=solve(a-(b-c[i])); if(!C && !D) { printf("NO\n"); return 0; } } } printf("YES\n"); } }
相关文章推荐
- 51nod 1557 两个集合(二分)
- 51nod 1557 两个集合 (二分搜索,思维逻辑好题)
- codeforces 468 B && 51nod 1557 两个集合
- 51nod 1557(两个集合)
- 51nod 1557 两个集合(hash)
- 51nod 1557 两个集合 (严谨的逻辑题)
- 51nod 1557 两个集合
- 51nod 1557 两个集合
- 51nod 1557 两个集合(Set)
- 51Nod-1557-两个集合
- 51nod 1557 两个集合 【记忆化枚举--判断】
- 51Nod 1557 集合问题
- 51nod:两个集合(并查集)
- Webwork操作集合是的两个有趣的特性-投影和筛选
- Median POJ - 3579 (两个二分求第k大的数)
- 非.NET语言调用.NET XML Web Services返回的数据集合的两个方法
- 51nod 1080 两个数的平方和【二分+预处理】
- 用C++标准库算法求两个集合的交集、并集、差集
- 高效比较两个list集合中的差集
- 51nod 1821 最优集合