完美數列(暴力枚舉)

描述

給定一個正整數數列,和正整數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); 
}  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章