#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool can(vector<long long>& ordr, long long m) {
long long elem = ordr[m];
long long acc = elem;
ordr[m] = 0;
int idx = 0;
while (idx < ordr.size() && ordr[idx] < acc) {
acc += ordr[idx];
idx += 1;
}
ordr[m] = elem;
return idx == ordr.size();
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
vector<long long> orig;
vector<long long> ordr;
for (int i = 0; i < n; i++) {
long long e;
cin >> e;
orig.push_back(e);
ordr.push_back(e);
}
sort(ordr.begin(), ordr.end());
long long a = 0, b = n - 1;
while (a < b) {
long long m = (a + b) / 2;
if (can(ordr, m)) {
b = m;
}
else {
a = m + 1;
}
}
bool possible = can(ordr, a);
long long rest = ordr[a];
for (int i = 0; i < n; i++) {
if (possible && orig[i] >= rest) {
cout << "T";
}
else {
cout << "N";
}
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; bool can(vector<long long>& ordr, long long m) { long long elem = ordr[m]; long long acc = elem; ordr[m] = 0; int idx = 0; while (idx < ordr.size() && ordr[idx] < acc) { acc += ordr[idx]; idx += 1; } ordr[m] = elem; return idx == ordr.size(); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<long long> orig; vector<long long> ordr; for (int i = 0; i < n; i++) { long long e; cin >> e; orig.push_back(e); ordr.push_back(e); } sort(ordr.begin(), ordr.end()); long long a = 0, b = n - 1; while (a < b) { long long m = (a + b) / 2; if (can(ordr, m)) { b = m; } else { a = m + 1; } } bool possible = can(ordr, a); long long rest = ordr[a]; for (int i = 0; i < n; i++) { if (possible && orig[i] >= rest) { cout << "T"; } else { cout << "N"; } } return 0; } |
English