Cod sursa(job #2762491)

Utilizator vara2021vara 2021 vara2021 Data 7 iulie 2021 18:16:53
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <queue>
#include <memory>
#include <algorithm>
#include <map>
#include <stack>
#include <vector>
#include <string>
#include <cstring>
#include <functional>
#include <random>       // std::default_random_engine
#include <chrono>       // std::chrono::system_clock
using namespace std;

int t, n, p;
int a[100100], x[100100];

int calc(int i) {
  for (int j = 1; j <= n; ++j) {
    x[j] = j;
  }
  int sol = 0, cur;
  do {
    if (p > a[x[i]]) cur = 1; else cur = 0;
    for (int j = i - 1, p1 = p - a[x[i]]; p1 - a[x[j]] > 0 && j >= 1; --j) { cur++; p1 -= a[x[j]]; }
    for (int j = i + 1, p1 = p - a[x[i]]; p1 - a[x[j]] > 0 && j <= n; ++j) { cur++; p1 -= a[x[j]]; }
    //for (int j = 1; j <= n; ++j) cout << a[x[j]] << " ";
    //cout << "# " << n-cur << endl;
    sol = max(sol, n - cur);
  } while (next_permutation(x + 1, x + n + 1));
  return sol;
}

int calc2(int i) {
  int s1 = a[n], l1 = 1; // left sum
  int s2 = a[n], l2 = 1; // right sum
  int k1 = 1;
  int k2 = n-1;
  while (1 <= k2 && s2 + a[k2] < p) { s2 += a[k2]; k2--; l2++; }
  while (k1 <= k2 && s2 + a[k1] < p) { k1++; }
  if (k1 > k2) return 0;
  s2 += a[k1]; l2++; // make s2 complete => s2 > p => hero dies
  while (1 <= k2 && s1 + a[k2] < p) { if (k2 != k1) { s1 += a[k2]; l1++; } k2--; }
  int l = i - 1;
  int r = n - i;
  int sol = 0;
  if (l > r) swap(l, r);
  if (r <= l2 && s2 >= p) { sol += r - l2 + 1; }
  if (l <= l1 && s1 >= p) { sol += l - l1 + 1; }
  return sol;
}

int main() {
  freopen("input.txt","r",stdin);
  cin >> t;
  while (t--) {
    cin >> n >> p;
    for (int i = 1; i <= n; ++i) {
      cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    if (n > 8) {
      cout << "error" << endl;
      continue;
    }
    for (int i = 1; i <= n; ++i) {
      cout << calc(i) << " ";
    }
    cout << endl;
    for (int i = 1; i <= n; ++i) {
      cout << calc2(i) << " ";
    }
    cout << endl;
  }
  return 0;
}