PAT (Basic Level)1030. 完美數列
阿新 • • 發佈:2019-02-14
題目描述:
給定一個正整數數列,和正整數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; }