51nod-1557 两个集合

 

 
 
 
思路:暴力搜索判断,两年前写的自己都看不懂了。。。

Code:

#include<iostream>
#include<algorithm>
using namespace std;

const int MAX_N=100005;
int n,a,b;
int c[MAX_N];
int d[MAX_N][2];
bool book[MAX_N][2];

int Find(int id);
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	bool p=true;
	cin>>n>>a>>b;
	for(int i=0,x;i<n;++i)
	{
		cin>>x;
		c[i]=x;
	}
	sort(c,c+n);
	for(int i=0;i<n;++i)
	{
		d[i][0]=-1;	d[i][1]=-1;
		int k1=lower_bound(c,c+n,a-c[i])-c;
		int k2=lower_bound(c,c+n,b-c[i])-c;
		if(k1!=n&&c[k1]==a-c[i])	d[i][0]=k1;
		if(k2!=n&&c[k2]==b-c[i])	d[i][1]=k2;
		if(d[i][0]==-1&&d[i][1]==-1){
			p=false;	break;
		}
	}
	for(int i=0;i<n&&p==true;++i)
		if(book[i][0]==false&&book[i][1]==false){
			int t=Find(i);
			if(t>0&&(t%2==1))	p=false;
		}
	if(p==true)	cout<<"YES"<<endl;
	else	cout<<"NO"<<endl;
	
	return 0;
}

int Find(int id)
{
	int ans=1;
	if(book[id][0]==false&&d[id][0]!=-1){
		int t=d[id][0];
		if(t==id)	ans=-100000000;
		book[id][0]=book[t][0]=true;
		ans+=Find(t);
	}
	if(book[id][1]==false&&d[id][1]!=-1){
		int t=d[id][1];
		if(t==id)	ans=-100000000;
		book[id][1]=book[t][1]=true;
		ans+=Find(t);
	}
	return ans;
}

 

 

 

 

//该思路有错误

思路:对于整数 x, 在集合A 和 集合 B 中的数分别为 A-x,B-x, 对于 x有三种情况:

一: A-x,B-x都不存在,那么肯定为 NO;

二:A-x,B-x存在一种,这样x可以分配到集合A或B中;

三:A-x,B-x都存在,这样的话,x只能与其中一个组合,那么对于 A-x,B-x,就要判断他们的另一组合数是否存在,若存在则可以继续组合,若 都不存在的话就为 NO.

Code :

#include<iostream>
#include<set>
using namespace std;

int n,a,b;
set<int> iset;

int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>a>>b;
	for(int i=0,x;i<n;++i)
	{
		cin>>x;
		iset.insert(x);
	}
	bool boo=true;
	for(auto x:iset)
		if(iset.find(a-x)!=iset.end()&&iset.find(b-x)!=iset.end()){
			if(iset.find(b-a+x)==iset.end()&&iset.find(a-b+x)==iset.end()){
				boo=false;	break;
			}
		}else	if(iset.find(a-x)==iset.end()&&iset.find(b-x)==iset.end()){
			boo=false;	break;
		}
	if(boo==true)	cout<<"YES"<<endl;
	else	cout<<"NO"<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值