牛客PAT1059

題目連接:https://www.nowcoder.com/pat/5/problems?page=3ios

思路:step1:排序spa

   step2:對i從0-N-1逐個判斷:以a[i]爲最小數時,最多能選多少個數code

其中,step2使用二分查找,求出結果blog

#include <iostream>
#include <algorithm>
#define MAXN 100003
using namespace std;
int findmax(int i);//求出以a[i]爲最小數時,最長的序列
void solve();
bool Perfect(int l,int h);//判斷是否是完美序列?

int p,N,ans;
int a[MAXN];
int main()
{
    cin>>N>>p;
    for( int i = 0;i<N;i++) cin>>a[i];
    sort(a,a+N);
    ans = 0;
    solve();
    cout<<ans<<endl;
    return 0;
}
void solve(){
    for(int i = 0;i<N;i++){
        if( ans > N-i) return ;//i都比N-ans大了,後面也沒判斷的必要了。。。
        int tmp = findmax(i);
        if( tmp > ans) ans = tmp;

    }
}
int findmax(int i){
    int l = i;
    int h = N-1;
    int mid;
    while( l<=h ){//二分查找
        mid = (l+h)/2;
        if( Perfect(i,mid)) l=mid+1;
        else h=mid-1;
    }
  //正常狀況下,l和h是一個知足,另外一個不知足。注意,但有時,會出現越界,致使判斷錯誤。。。。
    if( Perfect(i,l) && l<N) return l-i+1;
    else if( Perfect(i,h) && h>=i) return h-i+1;
    else return 0;
}
bool Perfect(int l,int h){
    long long tmp = a[l]*p;
    return tmp>=a[h];
}
相關文章
相關標籤/搜索