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              

 

你可能感兴趣的:(OJ)