在某些情况下,为什么在这个问题上获得TLE?

时间:2019-10-19 12:16:37

标签: c++ templates

https://www.hackerrank.com/challenges/c-class-templates/problem。 这是问题的链接。 我使用了基本模板概念和基本模板专业化。 这是代码:

template<class T>
class AddElements{

    T a;
    public:
    AddElements(T x)
    {
        a=x;
    }
    T add(T y)
    {
        return a+y;
    };
};
template<>
class AddElements<string>{

    string x;
    public:
    AddElements(string a)
    {
        x=a;
    }
    string concatenate(string b)
    {

        return x+b;
    };
};

int main () {
  int n,i;
  cin >> n;
  for(i=0;i<n;i++) {
    string type;
    cin >> type;
    if(type=="float") {
        double element1,element2;
        cin >> element1 >> element2;
        AddElements<double> myfloat (element1);
        cout << myfloat.add(element2) << endl;
    }
    else if(type == "int") {
        int element1, element2;
        cin >> element1 >> element2;
        AddElements<int> myint (element1);
        cout << myint.add(element2) << endl;
    }
    else if(type == "string") {
        string element1, element2;
        cin >> element1 >> element2;
        AddElements<string> mystring (element1);
        cout << mystring.concatenate(element2) << endl;
    }
  }
  return 0;
}

在某些情况下会提供TLE,但我不知道为什么。

1 个答案:

答案 0 :(得分:0)

您正在按值传递参数。尝试传递const引用或使用引用。

通常,您可以忽略TLE。它似乎取决于计算机的当前工作量。我运行了10次相同的代码,每次其他测试用例因TLE失败。一小时后,所有测试用例都使用相同的代码成功。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;

template<class T>
class AddElements{

    T a;
    public:
    AddElements(T x) : a(x) {}
    T add(T y) {
        return a + y;
    }
};

template<>
class AddElements<string>{

    string &a;
    public:
    AddElements(string &x) : a(x) {}
    string concatenate(string &y) {
        return a.append(y);
    }
};

int main () {
  int n,i;
  cin >> n;
  for(i=0;i<n;i++) {
    string type;
    cin >> type;
    if(type=="float") {
        double element1,element2;
        cin >> element1 >> element2;
        AddElements<double> myfloat (element1);
        cout << myfloat.add(element2) << endl;
    }
    else if(type == "int") {
        int element1, element2;
        cin >> element1 >> element2;
        AddElements<int> myint (element1);
        cout << myint.add(element2) << endl;
    }
    else if(type == "string") {
        string element1, element2;
        cin >> element1 >> element2;
        AddElements<string> mystring (element1);
        cout << mystring.concatenate(element2) << endl;
    }
  }
  return 0;
}

使用此代码,所有测试用例现已成功。一个小时前,一些测试用例失败了。