1. 程式人生 > >PAT (Basic Level)1030. 完美數列

PAT (Basic Level)1030. 完美數列

題目描述:

給定一個正整數數列,和正整數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
本來按照題目限制,我覺得應該用int就夠了,為了防止出現m*p溢位的情況,我特地轉成了除法問題。按理可以解決了吧,可是始終有個點過不了,改成long long或者double就過了。(騙紙………………)
#include <iostream>
#include <string>
#include <algorithm> 
#include <cmath>
#include <iomanip>
#include <ctype.h>
using namespace std;

int main()
{
  double num[100001],p=0;
  int N = 0, i = 0, j = 0, max = 0;
  cin >> N >> p;
  for (i = 0; i < N; i++)
    cin >> num[i];
  sort(num, num + N);

  for (j = N - 1, i = N - 1; i >= 0 && j >= 0; j--)
  {
    int mp = ceil(num[j] / p);
    while (i >= 0 && num[i] >= mp) i--;
    if (i< 0) {
      if (j+1 > max) max = j + 1;
      break;
    }
    else if (j - i > max) max = j - i;
  }

  cout << max << endl;
  return 0;
}