写了三次,一次TLE40,一次WA40,一次AC,不明白为什么
查看原帖
写了三次,一次TLE40,一次WA40,一次AC,不明白为什么
932039
lzy20091001楼主2023/7/30 19:42

思路和第一篇题解差不多

共同的部分:

#include <iostream>
#include <algorithm>
using namespace std;

int l, m, n, d[50005], lft, rgt;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> l >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> d[i];
    d[n + 1] = l;
    if (n == m)
    {
        cout << l << "\n";
        return 0;
    }
    sort(d, d + n + 2);
    lft = 0, rgt = l;
    while (rgt - lft > 1)
    {
        int mid = (lft + rgt) >> 1;
        if (judge(mid))
            lft = mid;
        else
            rgt = mid;
    }
    cout << lft << "\n";
    return 0;
}

不同的地方在于judge()函数:

TLE40分

记录详情

bool judge(int x)
{
    int last = 0, cnt = 0;
    while (true)
    {
        for (int i = last + 1; i <= n; i++)
        {
            if (d[i] - d[last] >= x)
            {
                last = i;
                cnt++;
                break;
            }
            if (cnt == n - m)
                return true;
            if (i == n)
                return false;
        }
        if (cnt == n - m)
            return true;
    }
}

WA40分,和TLE40分很像,把循环的边界改了一下

记录详情

bool judge(int x)
{
    int last = 0, cnt = 0;
    for (int j = 1; j <= n - m; j++)
    {
        for (int i = last + 1; i <= n; i++)
        {
            if (d[i] - d[last] >= x)
            {
                last = i;
                cnt++;
                break;
            }
            if (i == n)
                return false;
        }
    }
    return true;
}

AC,大改

bool judge(int x)
{
    int num = n - m, last = 0;
    for (int i = 0; i < num; i++)
    {
        int cur = last + 1;
        while (cur <= n && d[cur] - d[last] < x)
            cur++;
        if (cur > n || d[n + 1] - d[cur] < x)
            return false;
        last = cur;
    }
    return true;
}

前面两种为什么有问题呢?求大佬解答

2023/7/30 19:42
加载中...