您的位置:首页 > 其它

ACM-抽签(二分搜索)

2015-05-03 19:46 253 查看
//将写有数字的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: