我提交了解决方案,并在第 4 个测试用例中出现时间限制错误

I Submitted the solution and got time limit error in 4th test case

本文关键字:测试用例 时间 错误 解决方案 提交      更新时间:2023-10-16

这是代码力的问题我已经提交了一个解决方案,我得到了 TLE。如何移除 TLE

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    unsigned int y, k, n;
    set <int> s;
    cin >> y >> k >> n;
    if (y >= n)
    {
        cout << -1; return 0;
    }
    for (int i = y + 1; i <= n; i++)
    {
        if (i%k == 0)
        {
            s.insert(i - y);
        }
    }
    if (s.begin() == s.end())
    {
        cout << -1; return 0;
    }
    for (auto x : a)
        cout << x << " ";
}

问题似乎在算法层面。相反,要生成所有候选i值,然后测试它们是否可以被k整除,您可以直接在循环中生成这些值,增量等于 k

最小值imin等于k*((y+1)/k)k*((y+1)/k) + k,取决于y+1是否可以被k整除。

有两个好处:您考虑k更少的候选人,并且您避免了昂贵的%操作。

而且,当你找到一个值时,你可以直接打印出来,不需要记住它。

编辑:这是代码

#include <iostream>
int main()
{
    std::ios::sync_with_stdio(false);
    unsigned int y, k, n;
    std::cin >> y >> k >> n;
    unsigned int imin = k*((y+1)/k);
    if (imin < y+1) imin += k;
    if (imin > n) {
        std::cout << -1;
        return 0;
    }
    for (unsigned int i = imin; i <= n; i+=k)
    {
        std::cout << i-y << " ";
    }
    return 0;
}

编辑2:通过改变循环的边界可以避免最后i-y计算