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