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