ACM-抽签(二分搜索)

//将写有数字的n个纸片放入口袋,有放回抽取4次,4次数字的总和是否会等于m
//input
//n=3
//m=10
//k={1,3,5}
//
//output
//Yes
//
#include "iostream"
#include "algorithm"

using namespace std;

const int MAX_N=1000;
int n,m;
int k[MAX_N];
int kk[MAX_N*MAX_N];

bool binary_search(int x)//二分搜索
{
	int l=0,r=n*n;
	while(r>l)
	{
		int i=(r+l)/2;
		if(kk[i]==x) return true;
		else if(x>kk[i]) l=i+1;
		else r=i;
	}
	return false;
}


void solve()
{
	bool flag=false;//判断是否找到
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			kk[i*n+j]=k[i]+k[j];//枚举k[i]+k[j]
		}
	}

	sort(kk,kk+n);//排序便于进行二分搜索

	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(binary_search(m-k[i]-k[j]))
				flag=true;
		}
	}
	if(flag) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;

}

int main(int argc, char const *argv[])
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>k[i];
	}
	solve();
	return 0;
}



猜你喜欢

转载自blog.csdn.net/csx0987/article/details/45460841