https://www.patest.cn/contests/pat-b-practise/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;
}