前言:
眼前朋友们对“c语言oj是什么题”大约比较关切,各位老铁们都需要了解一些“c语言oj是什么题”的相关资讯。那么小编在网络上汇集了一些有关“c语言oj是什么题””的相关知识,希望各位老铁们能喜欢,你们快快来了解一下吧!今天带来的依旧是一道基础算法题——二分查找。
原题位于竞码编程,网址
题目:
给定一个数组, 快速判断是否出现了某个数.
输入:
第一行,一个整数n,(1<=n<=100000),表示数组元素的个数。
第二行,n个int类型整数,表示数组的元素,保证按照非递减的顺序给出。
第三行,一个数字q,(1<=q<=100000),表示查询的个数。
以下q行,每行一个整数x,分别表示查询。
输出:
对于每个查询, 如果x在数组中出现, 输出"Yes", 否则输出"No"。
示例:
输入
51 3 5 7 93123输出
YesNoYes
这道题的关键特征——查找某一个数是否在数组中出现过。用二分查找应该不会有意外,另外题目明确说明数据按非递减输入,一方面迎合了二分查找针对有序数组的特点,另一方面降低了题目难度,毕竟排序还需要sort一下嘛。分析完了后面写二分查找模板,输入输出格式处理好,上代码。
#include<stdio.h>#include<iostream>#include<string>#include<vector>using namespace std;const int N=100010;int main(){ int n,q; int a[N]; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } scanf("%d",&q); vector<string> s; for(int i=0;i<q;i++) { int l=1,r=n; int m; scanf("%d",&m); string ans="No"; while(l<=r) { int mid=(l+r)/2; if(m==a[mid]) { ans="Yes"; break; } else if(m>a[mid]) { l=mid+1; } else { r=mid-1; } } s.push_back(ans); } for(int i=0;i<s.size();i++) { cout<<s[i]; if(i!=s.size()-1) { printf("\n"); } } return 0;}
这里输入输出混杂了C语言和C++两种风格,这样做并不好,但是无奈题目提示了输入输出用scanf和printf,爬虫第一次提交的时候没注意结果超时挂掉了,后来改成了这个样子才通过,不知道是什么原理qaq。
我是字节爬虫,一名爬行在IT领域的菜鸟。
最后,求关注,求点赞,求分享啊!亲!