http://ac.jobdu.com/problem.php?pid=1386
WA了一发,因为没有考虑本身有序的情况。
貌似是cuhk曾经的面试题,当初准备CUHK面试的时候在别人博客看到过。
思路二分,朴素的想法我有,但是特殊情况没考虑好。
*mid与*first比,*mid与*end比,*mid>=*first,说明*mid现在在前面的有序部分。
*mid<*first,说明*mid在后面的有序部分。
对应修改first和end就行了
特殊情况有两个:
1、本身有序
2、1 1 1 0 1
1 0 1 1 1
这个例子
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int SIZE = 1000000+1;
int n;
int num[SIZE];
void specialJudge(int s, int e){
int v = num[s];
for(int i=s+1;i<=e;i++){
v = min(num[i], v);
}
printf("%d\n",v);
}
void solve(){
int firstPtr=0, endPtr=n-1;
if(num[endPtr]>num[firstPtr]){
printf("%d\n",num[firstPtr]);
return ;
}
while(firstPtr < endPtr && firstPtr != endPtr-1){
int mid = (firstPtr + endPtr)>>1;
if(num[mid] == num[firstPtr] && num[mid] == num[endPtr]){
specialJudge(firstPtr, endPtr);
return;
}
if(num[mid]>=num[firstPtr]){
firstPtr = mid;
}else{
endPtr = mid;
}
}
printf("%d\n", num[endPtr]);
}
int main()
{
//freopen("08.txt","r",stdin);
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
solve();
}
return 0;
}