NYOJ 86 找球号(一)

这个方法超时了TimeLimitExceeded,看来只能用二分查找了,即折半查找法,因为数据太大了,要输出太多的数。。。。你懂的。。。。

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=86

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define max 1000010
 4 int a[max],b;
 5 int cmp(const void *x,const void *y)
 6 {
 7 return *(int*)x-*(int*)y;
 8 }
 9 int main()
10 {
11     int n,m,i,j,high=0,low=0,mid=0;
12     scanf("%d %d",&n,&m);
13     for(i=0;i<n;i++)
14     scanf("%d",&a[i]);
15     qsort(a,n,sizeof(int),cmp);
16     for(j=0;j<m;j++)
17     {
18         scanf("%d",&b);
19         for(i=0;i<n;i++)
20         if(b==a[i]) break;
21         if(i==n) printf("No\n");
22         else printf("Yes\n");
23     }
24     //system("pause");
25     return 0;
26 }

改进后的: 采用折半查找法。。。。你懂的

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define max 1000010
 4 int a[max],b[max];
 5 int cmp(const void *x,const void *y)
 6 {
 7 return *(int*)x-*(int*)y;
 8 }
 9 int main()
10 {
11     int n,m,i,j,high,low,mid;
12     scanf("%d %d",&n,&m);
13     for(i=0;i<n;i++)
14     scanf("%d",&a[i]);
15     qsort(a,n,sizeof(a[0]),cmp);
16     for(i=0;i<m;i++)
17     scanf("%d",&b[i]);
18     for(i=0;i<m;i++)   //由于数比较多,所以采用二分法查找,一般的便利方法会超时 
19     {
20         high=n-1;
21         low=0;
22         mid=0;
23         while(low<high)
24         {
25             mid=(low+high)/2;
26             if(a[mid]==b[i])  {printf("YES\n");  break;}
27             else if(a[mid]>b[i]) high=mid-1;
28             else low=mid+1;
29         }
30         if(low>=high)   printf("NO\n");
31     }
32     system("pause");
33     return 0;
34 }
35              

 

posted on 2012-08-09 15:15  mycapple  阅读(355)  评论(0编辑  收藏  举报

导航