描述
給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。
現在給定參數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。
輸入
輸入第一行給出兩個正整數N和p,其中N(<= 105)是輸入的正整數的個數,p(<= 109)是給定的參數。第二行給出N個正整數,每個數不超過109。
輸出
在一行中輸出最多可以選擇多少個數可以用它們組成一個完美數列。
樣例輸入
10 8
2 3 20 4 5 1 6 7 8 9
樣例輸出
8中文題而且比較簡短,題意應該不難理解。
我的做法就是把這個序列從小到大排序,
假設排序後爲a1, a2, a3......an, 則 a1 <= a2 <= a3 <= ...... <= an.
我們可以用兩個座標i和j, a[i]表示的什完美數列中的最小值, a[j]表示的是完美數列中的最大值.
然後枚舉a[i], 得出a[i] *p <= a[j] 符合這個等式的最大的j是多少, 然後求得所有的j - i + 1的最大值.
本來以爲罰時會比較長,可能數據比較弱,0ms過的。
最近好久沒有寫博客了,趁着暑假最後的一段時間出去玩了一下,好吧,其實就是自己懶...
#include<cstdio>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 100010;
int main()
{
int n, p;
scanf("%d %d",&n,&p);
__int64 a[N];
for(int i=0;i<n;i++)
scanf("%I64d",a+i);
sort(a,a+n);
int s=0;
for (int i=0,j=0;i<n&&j<n;i++)
{
while(j<n&&a[i]*p>=a[j])
++j;
if(s<j-i)
s=j-i;
}
printf("%d\n",s);
}