Почему я получаю TLE в этом вопросе в некоторых случаях? - PullRequest
0 голосов
/ 19 октября 2019

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 голосов
/ 19 октября 2019

Вы передаете аргументы по значению. Попробуйте передать const ref или использовать ссылки.

Обычно вы можете игнорировать 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;
}

С этим кодом все тестовые примеры теперь были успешными. Час назад некоторые тесты были неудачными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...