1030 完美数列 (25 分) 测试点(1、3、4)
原题
https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224
测试点1
3 1
1 1 1
测试点3
1 1
1
加上这里的测试点介绍https://www.bilibili.com/read/cv11509699,把坑都踩了一遍(笑哭)
代码
第一次写测试点4未通过,没考虑周全,最大值不是固定的。
比如代入测试样例
10 8
25 20 8 7 6 5 3 3 3 1
输出8
第二次写测试点4又超时了。如下代码
#include
#include
#include
using namespace std;
long long result[100000] = {0};
int main(void)
{
int n;
long long p;
scanf("%d %lld", &n, &p);
for (int i = 0; i < n; i++)
cin >> result[i];
sort(result, result + n);
int max = 0;
for (int i = n - 1; i >= 0; i--)
{
int cnt = 0;
for (int j = 0; j <= i; j++)
{
if (result[j] * p < result[i])
cnt++;
else
{
if ((i+ 1 - cnt ) >= max)
max = i - cnt + 1;
break;
}
}
}
cout << max;
}
根据已排序的前提,判断过的不需再判断。
思路:
修改后:
#include
#include
using namespace std;
long long result[100000] = {0};
int main(void)
{
int n;
long long p;
scanf("%d %lld", &n, &p);
for (int i = 0; i < n; i++)
cin >> result[i];
sort(result, result + n);
int max, cnt = 0;
max = n == 0 ? 0 : 1;//测试点3
for (int i = n - 1; i >= 0; i--)
{
for (int j = i - cnt; j >= 0; j--)
{
if (result[j] * p >= result[i])
{
cnt++;
if (cnt >= max)//注意判断要放里面——测试点1
max = cnt;
}
else
break;
}
}
cout << max;
}