1. 程式人生 > >1030. 完美數列(25)(C++)

1030. 完美數列(25)(C++)

給定一個正整數數列,和正整數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這道題不知道為什麼總是讓我想起最小子列和那個題,可惜還是不能把演算法優化到N(⊙o⊙)…
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
    int n;
    int p;
    cin>>n>>p;
    std::vector<long> v;
    int i=0,num=1;
    for(i=0;i<n;i++){
      int x;
      cin>>x;
        v.push_back(x);
    }
    sort(v.begin(), v.end());
    for(i=0;i<n-1;i++){
      for(int j=i+num;j<n;j++){
        if(v[j]>v[i]*p)
          break;
        num++;
      }
    }
    cout<<num;
}