PAT (Basic Level)1030. 完美数列

来源:互联网 发布:英国工科强的大学知乎 编辑:程序博客网 时间:2024/06/05 19:49

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 82 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;}


0 0
原创粉丝点击