Pagini recente » Cod sursa (job #2761491) | Monitorul de evaluare | Borderou de evaluare (job #2762493) | Cod sursa (job #735036) | Cod sursa (job #2762491)
#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;
}