给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
【代码实现】得了24分,测试点5失分不知道问题是什么
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cstring>
using namespace std;
typedef unsigned long long l;
int isvalid(l, l, l);
int compare(const void*, const void*);
int main()
{
int n = 0;
l p = 0;
cin >> n >> p;
l* arr = new l[n];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
qsort(arr, n, sizeof(l), compare);
l max = -1, min = 0;
int left, right;
int flag = 0;
for (left = 0, right = n - 1; left <= right; left++, right--)
{
if (left)
{
if (!isvalid(arr[left - 1], arr[right + 1],p))
{
if (isvalid(arr[left], arr[right], p))
{
flag = 1;
break;
}
}
}
else
{
if (isvalid(arr[left], arr[right], p))
{
max = arr[right];
min = arr[left];
}
}
}
if (flag)
{
if (isvalid(arr[left - 1], arr[right], p) && isvalid(arr[left], arr[right + 1], p))
{
int ct1 = 0, ct2 = 0; //分别以两组为边界,谁符合条件的元素更多
int l1 = arr[left - 1];
int r1 = arr[right];
int l2 = arr[left];
int r2 = arr[right + 1];
for (int i = 0; i < n; i++)
{
if (arr[i] >= l1 && arr[i] <= r1)
ct1++;
if (arr[i] >= l2 && arr[i] <= r2)
ct2++;
}
if (ct1 >= ct2)
{
min = l1;
max = r1;
}
else
{
min = l2;
max = r2;
}
}
else if (isvalid(arr[left - 1], arr[right], p))
{
min = arr[left - 1];
max = arr[right];
}
else if (isvalid(arr[left], arr[right + 1], p))
{
min = arr[left];
max = arr[right + 1];
}
else
{
min = arr[left];
max = arr[right];
}
}
int ct = 0;
if (max!=-1) //成功找到合适的
{
for (int i = 0; i < n; i++)
{
if (arr[i] <= max && arr[i] >= min)
ct++;
}
}
cout << ct << endl;
delete[] arr;
return 0;
}
int compare(const void* p1, const void* p2)
{
l* pl1 = (l*)p1;
l* pl2 = (l*)p2;
return (*pl1) - (*pl2);
}
int isvalid(l n1, l n2, l p)
{
return n2 <= p * n1 ? 1 : 0;
}
博客围绕完美数列问题展开,给定正整数数列和参数p,若数列中最大值M和最小值m满足M≤mp,则为完美数列。需从给定数中选最多数构成完美数列,给出输入输出格式及样例,还展示了C++代码实现,不过测试点5失分。
377

被折叠的 条评论
为什么被折叠?



