【问题标题】:I Submitted the solution and got time limit error in 4th test case [closed]我提交了解决方案并在第四个测试用例中遇到了时间限制错误[关闭]
【发布时间】:2019-06-18 12:16:34
【问题描述】:

This is a problem on codeforces 我已经提交了一个解决方案,我得到了 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 << " ";
}

【问题讨论】:

  • 但在此之前,edit 你的问题是解释你的程序应该做什么,以及它是如何做到的。这被认为比简单地指向一个没人会关注的链接更好。
  • 你需要想出一个更聪明的算法。
  • 在哪里,哦,在哪里,你有使用#include 的想法吗??无论在哪里,您都应该停止从那里获取想法
  • @VaibhavPandey 别再用这种在线代码判断引擎浪费你的时间了。转而通过good book 工作。

标签: c++ stl


【解决方案1】:

问题似乎在算法层面。而不是生成所有候选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 计算

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2019-05-05
    • 2022-11-17
    相关资源
    最近更新 更多