标签:
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u011026968/article/details/48087413