pat 甲級 1085(upper_bound函式)
阿新 • • 發佈:2018-11-18
題目連結:
思路:找到兩個序列中最大的數和最小的數,並組成一個新的序列,儘量使序列的長度長一些,並且滿足
mi*p<=mx,一開始我想現將序列從小到大排序,然後用n*n的巢狀迴圈來做,思路沒錯,就是時間超限了,後來參考了網上的做法,發現可以直接在序列中找大於mi*p的值,用二分法就行了,(看來要序列超時就想想二分)。
補充:upper_bound()的用法
標頭檔案:#include<algorithm>
upper_bound(起始地址,終止地址,查詢的值),返回值是數值的第一個出現的位置,
lower_bound(起始地址,終止地址,查詢的值),返回的是數值的第一個出現的位置。
bindary_search(起始地址,終止地址,查詢的值),返回的是false或true,如果要找的值存在,返回true,否則返回false
注意:如果lower_bound()是左閉右開查詢,如果要記錄所找的位置,要減去a.begin()。
upper_bound參考文章:http://www.cnblogs.com/Tang-tangt/p/9291018.html
pat參考文章:https://blog.csdn.net/TateBrwonJava/article/details/83582854
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100010; typedef long long LL; LL a[maxn],p,mx; int main(void) { int l,r,i,j,n; scanf("%d%lld",&n,&p); for(i=0;i<n;i++) scanf("%lld",&a[i]); sort(a,a+n); mx=0; for(i=0;i<n;i++) { l=i; r=upper_bound(a,a+n,a[i]*p)-a; if(r-l>mx) mx=r-l; } printf("%lld\n",mx); return 0; }