#include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct potwory { int odebrane_zycie; int moc_eliksiru; int pozycja; }; potwory potwor[100001]; potwory pomocnik[100001]; int j = 0; int pozycja[100001] = {-1}; bool funkcja (potwory a, potwory b) { if(a.moc_eliksiru == b.moc_eliksiru) { return (a.odebrane_zycie > b.odebrane_zycie); } else return(a.moc_eliksiru > b.moc_eliksiru); } int main () { int liczba_potworow; scanf("%d", &liczba_potworow); int punkty_zycia; scanf("%d", &punkty_zycia); int dupa = 0; int dupa1 = 0; for (int i=0; i<liczba_potworow;i++) { scanf("%d",&potwor[i].odebrane_zycie); scanf("%d",&potwor[i].moc_eliksiru); potwor[i].pozycja=i+1; dupa = dupa + potwor[i].odebrane_zycie; dupa1 = dupa1 + potwor[i].moc_eliksiru; } dupa1 = dupa1 + punkty_zycia; if (dupa >= dupa1) { printf("NIE\n"); return 0; } sort(potwor,potwor+liczba_potworow, funkcja); int licznik = 0; for (int i = 0; i < liczba_potworow; i++) { if(punkty_zycia - potwor[i].odebrane_zycie > 0) { if(i+1 == liczba_potworow && j == 0) { punkty_zycia = punkty_zycia - potwor[i].odebrane_zycie; pozycja[licznik] = potwor[i].pozycja; } else { punkty_zycia = punkty_zycia - potwor[i].odebrane_zycie; punkty_zycia = punkty_zycia + potwor[i].moc_eliksiru; pozycja[licznik] = potwor[i].pozycja; } licznik++; } else { if(i+1 == liczba_potworow && punkty_zycia - potwor[i].odebrane_zycie <= 0) { printf("NIE\n"); return 0; } pomocnik[j].odebrane_zycie = potwor[i].odebrane_zycie; pomocnik[j].moc_eliksiru = potwor[i].moc_eliksiru; pomocnik[j].pozycja = potwor[i].pozycja; j++; } } int k = 0; for (int i = 0, a = j; i < j; i++, a--) { if(punkty_zycia - potwor[i].odebrane_zycie > 0) { if(i+1 == j && k == 0) { punkty_zycia = punkty_zycia - pomocnik[i].odebrane_zycie; pozycja[licznik] = pomocnik[i].pozycja; } else { punkty_zycia = punkty_zycia - pomocnik[i].odebrane_zycie; punkty_zycia = punkty_zycia + pomocnik[i].moc_eliksiru; pozycja[licznik] = pomocnik[i].pozycja; } licznik ++; } else { if(i+1 == j && punkty_zycia - pomocnik[i].odebrane_zycie <= 0) { printf("NIE\n"); return 0; } pomocnik[k].odebrane_zycie = pomocnik[i].odebrane_zycie; pomocnik[k].moc_eliksiru = pomocnik[i].moc_eliksiru; pomocnik[k].pozycja = pomocnik[i].pozycja; k++; } if (k > 0 && a == 1) { j=k; a=j; i=-1; k=0; } } if (punkty_zycia > 0) { printf("TAK\n"); for(int i=0; i < liczba_potworow; i++) { printf("%d ", pozycja[i]); } } else printf("NIE"); 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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct potwory { int odebrane_zycie; int moc_eliksiru; int pozycja; }; potwory potwor[100001]; potwory pomocnik[100001]; int j = 0; int pozycja[100001] = {-1}; bool funkcja (potwory a, potwory b) { if(a.moc_eliksiru == b.moc_eliksiru) { return (a.odebrane_zycie > b.odebrane_zycie); } else return(a.moc_eliksiru > b.moc_eliksiru); } int main () { int liczba_potworow; scanf("%d", &liczba_potworow); int punkty_zycia; scanf("%d", &punkty_zycia); int dupa = 0; int dupa1 = 0; for (int i=0; i<liczba_potworow;i++) { scanf("%d",&potwor[i].odebrane_zycie); scanf("%d",&potwor[i].moc_eliksiru); potwor[i].pozycja=i+1; dupa = dupa + potwor[i].odebrane_zycie; dupa1 = dupa1 + potwor[i].moc_eliksiru; } dupa1 = dupa1 + punkty_zycia; if (dupa >= dupa1) { printf("NIE\n"); return 0; } sort(potwor,potwor+liczba_potworow, funkcja); int licznik = 0; for (int i = 0; i < liczba_potworow; i++) { if(punkty_zycia - potwor[i].odebrane_zycie > 0) { if(i+1 == liczba_potworow && j == 0) { punkty_zycia = punkty_zycia - potwor[i].odebrane_zycie; pozycja[licznik] = potwor[i].pozycja; } else { punkty_zycia = punkty_zycia - potwor[i].odebrane_zycie; punkty_zycia = punkty_zycia + potwor[i].moc_eliksiru; pozycja[licznik] = potwor[i].pozycja; } licznik++; } else { if(i+1 == liczba_potworow && punkty_zycia - potwor[i].odebrane_zycie <= 0) { printf("NIE\n"); return 0; } pomocnik[j].odebrane_zycie = potwor[i].odebrane_zycie; pomocnik[j].moc_eliksiru = potwor[i].moc_eliksiru; pomocnik[j].pozycja = potwor[i].pozycja; j++; } } int k = 0; for (int i = 0, a = j; i < j; i++, a--) { if(punkty_zycia - potwor[i].odebrane_zycie > 0) { if(i+1 == j && k == 0) { punkty_zycia = punkty_zycia - pomocnik[i].odebrane_zycie; pozycja[licznik] = pomocnik[i].pozycja; } else { punkty_zycia = punkty_zycia - pomocnik[i].odebrane_zycie; punkty_zycia = punkty_zycia + pomocnik[i].moc_eliksiru; pozycja[licznik] = pomocnik[i].pozycja; } licznik ++; } else { if(i+1 == j && punkty_zycia - pomocnik[i].odebrane_zycie <= 0) { printf("NIE\n"); return 0; } pomocnik[k].odebrane_zycie = pomocnik[i].odebrane_zycie; pomocnik[k].moc_eliksiru = pomocnik[i].moc_eliksiru; pomocnik[k].pozycja = pomocnik[i].pozycja; k++; } if (k > 0 && a == 1) { j=k; a=j; i=-1; k=0; } } if (punkty_zycia > 0) { printf("TAK\n"); for(int i=0; i < liczba_potworow; i++) { printf("%d ", pozycja[i]); } } else printf("NIE"); return 0; } |