龙空技术网

每日OJ一题 1

IT竞赛菌 21

前言:

眼前朋友们对“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领域的菜鸟。

最后,求关注,求点赞,求分享啊!亲!

标签: #c语言oj是什么题 #oj平台c语言题库