ACM-抽签(二分搜索)

来源:互联网 发布:vb打印输出九九乘法表 编辑:程序博客网 时间:2024/04/28 21:31
//将写有数字的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;}



0 0