1. 程式人生 > >pat 甲級 1085(upper_bound函式)

pat 甲級 1085(upper_bound函式)

題目連結:

思路:找到兩個序列中最大的數和最小的數,並組成一個新的序列,儘量使序列的長度長一些,並且滿足

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;
}