我提交了解决方案,并在第四个测试用例中遇到了时限错误

时间:2019-01-24 17:15:53

标签: c++ stl

This is a problem on codeforces 并且我已经提交了解决方案,并且获得了TLE。 如何删除TLE

#example1 {
  border: 2px solid red;
  border-radius: 25px;
}

#example2 {
  border: 2px solid red;
  border-radius: 50px 20px;
}

1 个答案:

答案 0 :(得分:2)

问题似乎在算法级别上。代替生成所有候选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计算