读书人

湖南省科大水题反思

发布时间: 2012-09-18 16:21:42 作者: rapoo

湖南科大水题反思

问题 I: 简单查找时间限制: 3 Sec 内存限制: 32 MB
提交: 116 解决: 11
[提交][状态][讨论版]
题目描述

给定一个集合,查找元素是否在集合中出现。

输入

每个测试用例由多行组成,第一行是两个整数n和m,这2个数的取值在1到3 000 000之间。

自第二行起一共有n+m个整数,其中前面n个整数代表集合的元素,随后的m个整数是待查询的数。n+m个整数的取值在范围1到10 000 000之间。

输出

对于每个待查询的数,如果在集合中则输出yes,否则输出no.

样例输入
5 345 56 23 6 56633 66 63 22934 235 555555 230 0
样例输出
no
no
yes
yes
no
 
本来用set 直接过了 但是stl耗时   老师加强数据后就超时了
 
然后就想到用二分法    把二分函数写到了主函数外  结果依旧超时
 
郁闷    但是 把二分函数写进了主函数以后就过了
 
这个题给我的警示就是  以后 尽量少调用函数  因为调用也耗时间
 
set超时版
#include<stdio.h> #include<set> using namespace std; int main() {     int n,m,i,j;     while(scanf("%d %d",&n,&m)!=EOF)     {         if(!n&&!m) break;         int num;         set<int>ss;         set<int>::iterator it;         for(i=0;i<n;i++)         {             scanf("%d",&num);             ss.insert(num);         }         for(i=0;i<m;i++)         {             scanf("%d",&num);             it=ss.find(num);             if(it!=ss.end())                 printf("yes\n");             else printf("no\n");           }     }     return 0; } 
//ac
#include<stdio.h> #include<algorithm> using namespace std; int a[3000000+100]; int n; int main() {     int m,i,j,num,left,right,mid,flag;        while(scanf("%d %d",&n,&m)!=EOF)        {            if(!n&&!m) break;            for(i=1;i<=n;i++)                scanf("%d",&a[i]);            sort(a+1,a+1+n);            for(i=0;i<m;i++)            {                scanf("%d",&num);                left=1;right=n;                flag=0;mid;                while(left<=right)                {                    mid=(right+left)/2;                    if(a[mid]>num) right=mid-1;                    else if(a[mid]<num) left=mid+1;                    else if(a[mid]==num) {flag=1;break;}                }                if(flag)                    printf("yes\n");                else printf("no\n");            }        }        return 0; } 

 

读书人网 >编程

热点推荐