小明有个长度为 n 的数组 A。由于数组实在太大了,所以小明也不知道数组里面有什么数字,所以小明会经常询问整数 x 是否在数组 A 中。
输入格式第一行输入两个整数 n 和 m,分别表示数组的长度和查询的次数。
接下来一行有 n 个整数 ;
接下来 m 行,每行有 1 个整数 x,表示小明询问的整数。
输出格式对于每次查询,如果可以找到,输出"YES",否则输出"NO"。
数据范围很大,建议使用快速排序;例:
输入:
10 5 1 1 1 2 3 5 5 7 8 9 0 1 4 9 10
输出:
NO YES NO YES NO
整体思路:首先输入n,m的值;用for循环和数组记录n个数;在使用二分法前,我们必须将数组里面的数进行排序,当数组里面的数非常多时;我们使用快速排序能够节省很多时间,也就是我们常说的时间复杂度,排序后,使用二分法寻找输入的值即可。快速排序在此不细讲,需要的可以查看我的文章。
#includevoid quicksort(int arr[],int low,int high){ //利用快速排序将输入的n个数从小到大排序; int first=low; //用first 和 last分别接受 low 和high的值,便于下面递归再次 int last=high; //使用 low 和high 就不用重新定义了。 int key=arr[first]; // 定义一个key ,一般为数组的第一个数; if(low>=high) return ; while(first =key){ //从后往前 与key进行比较,如果大于key 则不动;然后 last--; // last--,倒数第二个数再与key比较;如果小于key; } arr[first]=arr[last]; //将该值赋给第一个位置;然后再进行到下一步 while(first arr[mid]) left=mid+1;//right 为角标;同理 当arr[mid] right) printf("NOn"); } int main() { int n,m; int i,j; scanf("%d %d",&n,&m); // 输入n值和m值;n为总的人数,m为标记点; int arr[n];int arr2[m]; //定义两个数组,数组长度分别为n和m; for(i=0;i



