User 14441847 Ответов: 1

Оптимизация и ускорение обработки кода до <=1 сек (на тестовый случай)


любая помощь в оптимизации следующего кода, чтобы он работал быстрее.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class gfg
{
public:
bool satisfiable(std::vector<int> a, std::vector<int> b) {
  while (!a.empty()) {
    std::sort(b.begin(), b.end(), std::greater<int>());
    int k = a.back();
    a.pop_back();
    if (k > b.size()) return false;
    if (k == 0) continue;
    if (b[k - 1] == 0) return false;
    for (int i = 0; i < k; i++)
      b[i]--;
  }
  for (std::vector<int>::iterator i = b.begin(); i != b.end(); i++)
    if (*i != 0)
      return false;
  return true;
}

};


int main()
{
    gfg g;
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int r,c,n,cnt=0;
    cin >> n;
    while(cnt<n){
        cnt++;
    cin >> r >> c;
    int x;
      vector<int> a;
      vector<int> b;
    for(int i=0;i<r;i++){
            cin >> x;
          a.push_back(x);
    }

    for(int j=0;j<c;j++){
          cin >> x;
          b.push_back(x);
    }



    if(g.satisfiable(a,b)) cout << "YES\n";
    else cout << "NO\n";
    }

    return 0;
}

Ожидаемое : среднее время обработки 1С или меньше на тестовый случай фактическое : среднее время обработки от 2С до 2,5 С на тестовый случай

Что я уже пробовал:

Tried making function inline, tried cin.TIE(NULL), tried ios_base::sync_with_stdio(false);

Patrice T

Что же должен делать код ?
Дайте ссылку на вызов

1 Ответов

Рейтинг:
1

k5054

Несколько быстрых мыслей:

В gfg::satisfiable(), вектор б он не переупорядочивается, так что вам не нужно каждый раз сортировать его по порядку. while петля. Вы декремента элементы 0..к элементы б, но это не изменит порядок сортировки.

push_back() проверяет текущее распределение вектора и, возможно, повторно распределяет каждый раз. Предварительное выделение вектора и использование прямого доступа к элементам сократит время, затрачиваемое на настройку вектора:

vector<int> a(r);
for(int i = 0; i < r; ++i)
    cin >> a[i];
Это очень поможет, если количество входных данных велико;

Если возможно, прочитайте весь входной файл за один раз, а затем используйте обработку строк для его анализа. Входной формат, вероятно, довольно прост, поэтому должна быть возможность написать синтаксический анализатор, который не использует (возможно, медленный) iostream объект.

Если вы не можете прочитать весь входной файл за один раз, возможно, вы можете использовать getline() чтобы прочитать некоторые или все элементы вектора, а затем разобрать их.