二分法
第一题 二分查找
题目: 给出有 n 个元素的由小到大的序列,请你编程找出某元素第一次出现的位置。(n<=10^6)。
分析: 他已经帮我们排好序了,所以直接二分,把left设置为1,right为n,算出mid,判断是否大于mid如果大于则把left右移到mid,否则把right左移到mid。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,q;
int a[1000005];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
cin>>q;
int l=1,r=n;
while(l+1<r)
{
int mid=(l+r)/2;
if(a[mid]>=q)
r=mid;
else
l=mid;
}
if(a[l]==q) cout<<l<<endl;
else if(a[r]==q) cout<<r<<endl;
else cout<<-1<<endl;
return 0;
}
第二题 奇怪的函数
题目: 使得x^x达到或超过n位数字的最小正整数x是多少?
分析: 这就是让我们把算出的位数,跟n做比较,那么就需要log10来算位数,那么如果乘起来肯定要超的,所以我们利用log上面的数字可以提前的,放到前面,就可以算出位数了。
代码:
#include <bits/stdc++.h>
using namespace std;
long long mid,l,r,n;
int main()
{
cin>>n;
l