題目連接: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]; }