PAT1085 Perfect Sequence(二分)
阿新 • • 發佈:2019-02-06
題意:
從n個數中選擇若干個數,要求這些數中的最大值不超過最小值的p倍。要求選出的數的最大個數。
思路:
這題就是一個二分查詢問題,先排序,然後二分查詢第一個大於最小值p倍的數的位置。注意a[i]*p可能達到10^18,所有要用long long型。
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+50; int num[maxn]; int n,p; int binarysearch(int i){ int l=i+1,r=n-1; long long x=(long long)num[i]*p; if(num[n-1]<=x) return n; while(l<r){ int mid=(l+r)/2; if(num[mid]<=x) l=mid+1; else r=mid; } return l; } int main(){ scanf("%d%d",&n,&p); for(int i=0;i<n;i++){ scanf("%d",&num[i]); } sort(num,num+n); int res=1; for(int i=0;i<n;i++){ int j=binarysearch(i); res=max(res,j-i); } printf("%d\n",res); return 0; }
二分總結:
要求第一個滿足條件的元素位置:
//二分上下界為左閉右閉的[l,r],求第一個滿足條件的元素位置
int binery_search(int a[],int l,int r,int x){
while(l<r){
int mid=(l+r)/2;
if(條件成立){
right=mid;
}else{
l=mid+1;
}
}
return l;
}