如何改进Codeforces解决方案?它显示超出时间限制

时间:2015-06-29 07:38:21

标签: c++ performance

我在Codeforces问题上遇到了超出时限的错误(测试案例#28)。

链接为http://codeforces.com/problemset/problem/525/B 解决方案无处可在谷歌上找到。 有没有人知道如何更快地使这个解决方案。

我的代码是:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;

int main() {
    char str[2000005];
    scanf("%s", &str);
    long long l = strlen(str);
    long long k, i, j, days, pos, counter = 0;
    scanf("%I64d", &days);
    for (k = 1; k <= days; k++) {
f:
        cin >> pos;
        counter++;
        i = pos - 1;
        j = l - pos;
        // swap(str[pos - 1], str[l - pos])
start:
        swap(str[i], str[j]);
        i++;
        j--;
        if (i <= j)
            goto start;
        else if (i > j && counter < days)
            goto f;
        else if(counter==days)
            break;
    }
    printf("%s", str);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我解决这个问题的方法:

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    int m, i, a[200002];
    cin >> s >> m;
    while (m--) {
        cin >> i;
        a[i]++;
    }
    int net = 0, n = s.length();
    for (int i = 1; 2 * i <= n; i++) {
        net += a[i];
        if (net % 2) swap(s[i - 1], s[n - i]);
    }
    cout << s;
    return 0;
}

建议:

  1. 如果指定了时间限制,请勿使用goto,请使用forwhile
  2. 在代码中查找警告
  3. 在这种情况下,
  4. long long是不必要的
  5. 正确格式化代码有助于调试
  6. 请勿混用C I / O和C ++ I / O,请阅读this blog
  7. 编辑:每次都不需要反转字符串。我们需要计算在字符串的每个位置开始的反转次数。请阅读此blog entry了解更多信息。