这是代码力的问题我已经提交了一个解决方案,我得到了 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
计算