找球号(一)
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,现在说一个随机整数k(0<=k<=100000100),判断编号为k的球是否在这堆球中(存在为"YES",否则为"NO"),先答出者为胜。现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利。
-
输入
-
第一行有两个整数m,n(0<=n<=100000,0<=m<=1000000);m表示这堆球里有m个球,n表示这个游戏进行n次。
接下来输入m+n个整数,前m个分别表示这m个球的编号i,后n个分别表示每次游戏中的随机整数k
输出
- 输出"YES"或"NO" 样例输入
-
6 4 23 34 46 768 343 343 2 4 23 343
样例输出
-
NO NO YES YES
-
my answer:
-
方法-:map
-
果然是map大法好,又快又好。。。AC了;#include<iostream> #include<map> using namespace std; int main() { int m,n; cin >> m >> n; map<int,int> p; int s; for(int i =0;i != m;i ++){ cin >> s; p[s]++; } while(n--){ cin >> s; if(p[s]) cout << "YES" << endl; else cout <<"NO"<<endl; } return 0; }
-
下面几种是超时的也贴出来骚骚〉〉〉〉〉〉〉〉〉〉
-
方法二:
-
方法三://折半。。。吧,自己凭感觉写的。 #include<iostream> #include<algorithm> #include<cstring> using namespace std; int m, n; int a[1000001]; bool zheban(int s[], int q) { sort(s,s+m); int mid, be=0, en=m-1; // cout <<be <<" " << en <<endl; mid = (en+be)/2; while(be != en) { if(s[be]==q || s[en] == q || s[mid] == q) {// cout << s[be] << " " << q << endl; return true; } else { mid= (be+en)/2; if(s[mid]<q) be=mid; else if(s[mid]>q) en=mid; } } return false; } int main() { cin >> m >> n; for(int i = 0;i !=m;i ++) cin >> a[i]; while(n--) { int t; cin >> t; if(zheban(a,t)) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
-
vector当然是TLE啦。。。。。。这是我第一个想法
-
#include<iostream> #include<vector> #include <algorithm> #include<stdio.h> using namespace std; int main() { int m,n; vector<int> str; scanf("%d%d",&m,&n); int s; for(int i = 0;i != m;i ++){ scanf("%d",&s); str.push_back(s); } while(n--){ int h; cin>>h; vector<int>::iterator it= find(str.begin() ,str.end() , h); if(it!=str.end() ) printf("YES\n"); else printf("NO\n"); } return 0; }
话说当我程序超时然后因不知如何优化而忧心忡忡的时候,某位巨巨跳出来说到: -
本题目尝试采用了七种方法解决: 解答一:用map,因为判题有问题,没有成功判题; 解答二:用set,时间:836 内存:968; 解答三:用快速排序 + find,超时 解题四:qsort + 折半 时间:640 内存:8116 解答五:sort + 折半 时间:528,内存,4116 解答六:冒泡 + 折半 超时 解答七:二叉排序树 时间:664 内存:15884 结论: 1、sort + 折半是最佳效果。 2、find、 冒泡排序要慎用,性能太差; 3、qsort不如sort,sort是优化的qsort; 4、二叉排序树内存消耗很大 看有采用hash解答此题,时间更优。
-
第一行有两个整数m,n(0<=n<=100000,0<=m<=1000000);m表示这堆球里有m个球,n表示这个游戏进行n次。