众所周知,二分查找是这么写的:
#include<bits/stdc++.h>
using namespace std;
int n, x;
int arr[10000000];
int main()
{
// freopen("01.in", "r", stdin);
// freopen("01.out", "w", stdout);
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &x);
for(int i=1; i<=n; i++) scanf("%d", &arr[i]);
int l=1, r=n;
while(l<=r)
{
int mid = l+(r-l)/2;
if(arr[mid]<x) l=mid+1;
else r=mid-1;
}
printf("%d\n", l);
}
return 0;
}
但经过实际验证,这么写更快(xuan)
#include<bits/stdc++.h>
#include<random>
using namespace std;
int n, x;
int arr[10000000];
mt19937 rd(time(0));
int main()
{
freopen("01.in", "r", stdin);
freopen("02.out", "w", stdout);
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &x);
for(int i=1; i<=n; i++) scanf("%d", &arr[i]);
int tmp = rd()%n+1;
while(arr[tmp]!=x)
{
if(arr[tmp]<x) tmp=rd()%(n-tmp)+tmp+1;
else tmp=rd()%(tmp-1)+1;
}
printf("%d\n", tmp);
}
return 0;
}
真的会快几十毫秒qwq