#include <cstdio>
#include <algorithm>
using namespace std;
struct Sum{
int pozycja;
unsigned int waga;
int jakosc;
//int zjedzone;
}sum[500005];
int n;
bool odNajmniejszego(Sum a, Sum b){
return a.waga < b.waga;
}
bool kolejne(Sum a, Sum b){
return a.pozycja < b.pozycja;
}
void wyswietl(const char *str){
printf("%s\n",str);
for(int i=0; i<n; i++){
printf("%d - i:%d q:%d\n",sum[i].waga,sum[i].pozycja,sum[i].jakosc);
}
printf("\n");
return;
}
int main(){
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d",&sum[i].waga);
sum[i].pozycja = i;
sum[i].jakosc = 0;
//sum[i].zjedzone = 0;
}
sort(sum, sum+n, odNajmniejszego);
//wyswietl("Najmniejsze");
int suma=0; //najwiekszy zbior najmniejszych sumow do polkniecia
int prestiz=0;//aktualny prestiz - najbardziej prestizowym gatunkiem sa wszystkie sumy o najwyzszej jakosci
bool zjadaNajwiekszego = false; //osiagniecie mozliwosci zjedzenia wszystkich ryb
//ustawianie pierwszego karpia
suma += sum[0].waga;
int i=1;
//zliczaj wszystkie najmniejsze karpie niezdolne do polkniecia kogokolwiek
while(i<n && sum[i].waga == sum[i-1].waga){
suma += sum[i].waga;
i++;
//printf("!");
}
//no to jesli jest chociaz jeden wiekszy w akwenie to sa przynajmniej jacys pretendenci do nagrody Krola Karpia
if(i<n)
prestiz++;
if(prestiz == 0){
while(n-->0){
printf("N");
}
printf("\n");
return 0;
}
for(; i<n-1; i++){
if(zjadaNajwiekszego){
sum[i].jakosc = prestiz;
// printf("^: %d\n",i);
continue;
}
if(sum[i].waga + suma > sum[i+1].waga){
sum[i].jakosc = prestiz;
suma += sum[i].waga;
if(suma > sum[n-1].waga)
zjadaNajwiekszego = true;
// printf("+: %d\n",i);
continue;
}
sum[i].jakosc = prestiz;
suma += sum[i].waga;
prestiz++;
// printf("-: %d\n",i);
}
//sprawdz najwiekszego karpia czy to boss nad bossy
if(!zjadaNajwiekszego && sum[n-2].waga + suma < sum[n-1].waga){
prestiz++;
suma += sum[i].waga;
// printf("Latest Biggest+: %d\n",i);
}
sum[n-1].jakosc = prestiz;
sort(sum, sum+n, kolejne);
// wyswietl("Kolejne");
for(int i=0; i<n; i++){
if(sum[i].jakosc == prestiz)
printf("T");
else
printf("N");
}
printf("\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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <cstdio> #include <algorithm> using namespace std; struct Sum{ int pozycja; unsigned int waga; int jakosc; //int zjedzone; }sum[500005]; int n; bool odNajmniejszego(Sum a, Sum b){ return a.waga < b.waga; } bool kolejne(Sum a, Sum b){ return a.pozycja < b.pozycja; } void wyswietl(const char *str){ printf("%s\n",str); for(int i=0; i<n; i++){ printf("%d - i:%d q:%d\n",sum[i].waga,sum[i].pozycja,sum[i].jakosc); } printf("\n"); return; } int main(){ scanf("%d",&n); for(int i=0; i<n; i++){ scanf("%d",&sum[i].waga); sum[i].pozycja = i; sum[i].jakosc = 0; //sum[i].zjedzone = 0; } sort(sum, sum+n, odNajmniejszego); //wyswietl("Najmniejsze"); int suma=0; //najwiekszy zbior najmniejszych sumow do polkniecia int prestiz=0;//aktualny prestiz - najbardziej prestizowym gatunkiem sa wszystkie sumy o najwyzszej jakosci bool zjadaNajwiekszego = false; //osiagniecie mozliwosci zjedzenia wszystkich ryb //ustawianie pierwszego karpia suma += sum[0].waga; int i=1; //zliczaj wszystkie najmniejsze karpie niezdolne do polkniecia kogokolwiek while(i<n && sum[i].waga == sum[i-1].waga){ suma += sum[i].waga; i++; //printf("!"); } //no to jesli jest chociaz jeden wiekszy w akwenie to sa przynajmniej jacys pretendenci do nagrody Krola Karpia if(i<n) prestiz++; if(prestiz == 0){ while(n-->0){ printf("N"); } printf("\n"); return 0; } for(; i<n-1; i++){ if(zjadaNajwiekszego){ sum[i].jakosc = prestiz; // printf("^: %d\n",i); continue; } if(sum[i].waga + suma > sum[i+1].waga){ sum[i].jakosc = prestiz; suma += sum[i].waga; if(suma > sum[n-1].waga) zjadaNajwiekszego = true; // printf("+: %d\n",i); continue; } sum[i].jakosc = prestiz; suma += sum[i].waga; prestiz++; // printf("-: %d\n",i); } //sprawdz najwiekszego karpia czy to boss nad bossy if(!zjadaNajwiekszego && sum[n-2].waga + suma < sum[n-1].waga){ prestiz++; suma += sum[i].waga; // printf("Latest Biggest+: %d\n",i); } sum[n-1].jakosc = prestiz; sort(sum, sum+n, kolejne); // wyswietl("Kolejne"); for(int i=0; i<n; i++){ if(sum[i].jakosc == prestiz) printf("T"); else printf("N"); } printf("\n"); return 0; } |
English