找球号(一)
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
- 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,现在说一个随机整数k(0<=k<=100000100),判断编号为k的球是否在这堆球中(存在为"YES",否则为"NO"),先答出者为胜。现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利。
分析:这是一道简单的查找元素的题,如果简单一个一个查找,时间复杂度是O(n),提交的时候提示超时,于是想到了用二分查找的时间复杂度降为了O(logn),代码如下:
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int a[1000100]; bool binary_search(int *a,int len,int goal) { int low=0; int high=len-1; while(low<=high) { int mid=(low+high)/2; if(a[mid]==goal) return true; else if(a[mid]>goal) high=mid-1; else low=mid+1; } } int main() { int n,m,t; cin>>n>>m; //刚开始用while循环没有过去,去掉后过去啦 for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); for(int i=0;i<m;i++) { cin>>t; if(binary_search(a,n,t)) { printf("YES\n"); } else printf("NO\n"); } return 0; }
时间: 2024-11-05 16:29:19