题意是:多组输入。输入n个数,无序的,再输入一个数,查找是否存在,若是则输出"YES",否则输出"NO"。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int q[100008];
- int fh(int s,int t)
- {
- int key;
- key=q[s];
- while(s<t) //小于号,没有等于。
- {
- while(s<t&&q[t]>=key)
- t--;
- q[s]=q[t];
- while(s<t&&q[s]<=key)
- s++;
- q[t]=q[s];
- }
- q[s]=key;
- return s;
- }
- void kp(int s,int t)
- {
- int f;
- if(s<t)
- {
- f=fh(s,t);
- kp(s,f-1); //重复快排
- kp(f+1,t);
- }
- }
- int erfen(int s,int t,int key)
- {
- int mid;
- while(s<=t)
- {
- mid=(s+t)/2;
- if(q[mid]==key) return key;
- else if(q[mid]>key) t=mid-1; //二分查找,此时中间的数为最大的,数据减少一半。
- else s=mid+1;
- }
- return -1;
- }
- int main()
- {
- int n,s,i,t;
- while(~scanf("%d",&n))
- {
- memset(q,0,sizeof(q));
- for(i=0; i<n; i++)
- scanf("%d",&q[i]);
- kp(0,n-1);//此处是数组的起始点,数组中的元素是从0开始的到n-1结束的,所以是0,n-1。
- scanf("%d",&s);
- t=erfen(0,n,s);
- if(t!=-1)
- printf("YES\n");
- else
- printf("NO\n");
- }
- return 0;
- }