我是编程领域的初学者,我已经开始解决Codeforces上的问题,这是我的第一个问题,当我使用此代码提交此问题解决方案A Simple Task时
#include <iostream>
#include <string>
using namespace std;
void swapchar(char &x, char &y)
{
char temp;
temp = x;
x = y;
y = temp;
}
void main()
{
string s;
long n, q;
long i, j;
bool k;
cin >> n >> q;
cin >> s;
for (int x = 0; x<q; x++)
{
cin >> i >> j >> k;
if (i<1 || j<1 || i>n || j>n)
break;
if (k == 1)
{
for (int u = i - 1; u < j; u++)
{
for (int v = u + 1; v < j; v++)
{
if (s[u] > s[v])
swapchar(s[u], s[v]);
}
}
}
else if (k == 0)
for (int u = i - 1; u < j; u++)
{
for (int v = u + 1; v < j; v++)
{
if (s[u] < s[v])
swapchar(s[u], s[v]);
}
}
}
cout << s << endl;
}
然后代码的输出是: -
Time limit exceeded on test 6
当我搜索我发现的测试6时: -
Test: #6, time: 5000 ms., memory: 12 KB, exit code: -1, checker exit code: 0, verdict: TIME_LIMIT_EXCEEDED
输入
2256 44182
kanqevxwgecliptqmdsgnflqyohgtukphlbmjxndbtjqujuafxankfghlseytdwdviamqjscacuyrghriuaihxtyersgnyvigenpflwequgbdusnvlgplxjxkqhjbdvkmufpoirqueufblnnrnbhmcnvewzfdonwjgswuneimtykntwgrlfqlvkdblwjzplhffzqpopbjmvrjcxyzgxqhkjbrgdqnipsipexpoozphfrgzboiiiskawtbhegerhvknrzljclhnpokpazhspsmzeiujddlpfireoyjzriickcuwtbimxjbhunedcdgaabztczkzmahnriarzcmnkjrrfqkodxbpocmxjvutpqbmawcsghwxdidhmwbfxuqegpjtqfvaloycogvoxdtjotlknazaeofaxlomeywwlezlndhpjwbgpxgkvubropxffytucvlbhjugzqgglrezoqsrvwkdrbuehbjxtgobugghqrgbgacqi...
我不知道这个问题是什么意思以及如何解决它 请解释并帮助我。
答案 0 :(得分:1)
您正在使用具有O(n ^ 2)复杂度的选择排序(具有一些多余的交换),请尝试使用std::sort
。您的代码不会有太多变化:
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
string s;
long n, q;
long i, j;
bool k;
cin >> n >> q;
cin >> s;
for (int x = 0; x<q; x++)
{
cin >> i >> j >> k;
if (i<1 || j<1 || i>n || j>n)
break;
if (k == 1)
{
std::sort(s.begin() + i-1, s.begin() + j);
}
else if (k == 0)
std::sort(s.begin() + i-1, s.begin() + j, std::greater<char>());
}
cout << s << endl;
}
std::sort(s.begin() + i-1, s.begin() + j);
从s.begin() + i-1
开始排序,但不包括s.begin() + j
。第二种方法是使用>
(std::greater
)代替<
进行相反排序。请注意#include <algorithm>
的{{1}}和std::sort
的{{1}}。
请注意,我已经删除了#include <functional>
功能,因为我们不再需要它了,我还将std::greater
的返回类型更改为swapchar
,因为它是&#39;应该是。
上面的代码设法处理测试6你遇到问题但是超过了测试9的时间限制(我甚至尝试过其他一些小的改动)。
要完成9+以上的测试,您可能应该更多地考虑问题和可能的输入,例如以下排序查询:
main
在这里,我们会进行大量无用的排序,如果您确定第9个问题,我将不会感到惊讶。首先,我们按升序对范围[20,57]和[89,950]进行排序,然后我们按降序对范围[57,100]进行排序,然后按升序顺序采用相同的范围,然后完全覆盖第一个范围。最后,我们按降序对范围[1,9500]进行排序,覆盖我们可能完全遗漏的所有先前排序,因为它们反正被覆盖了。
我们可以利用以后排序可以并且可能将覆盖以前的知识。我们可以先保存所有&#34;排序查询&#34;我们得到了,后来从最后一个开始(因为那个人无论如何都会覆盖所有以前的那个)并按相反的顺序排序我们尚未排序的范围。通过这种方式,我们可以摆脱许多无用的排序,即使我们以后会覆盖它并加快速度,我们也会这样做。