#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Monster {
int idx;
int hurts;
int heals;
};
typedef vector< Monster > monsters_t;
ostream& operator<< (ostream&, monsters_t const&);
void read_data(int& health, monsters_t& M)
{
int num_creatures;
cin >> num_creatures >> health;
for ( int i = 0; i < num_creatures; ++i ) {
Monster m;
m.idx = i + 1;
cin >> m.hurts;
cin >> m.heals;
M.push_back( m );
}
}
void prepare_fights(monsters_t& M)
{
auto it_zero = partition ( M.begin(), M.end(), [](Monster const& m) {
return m.heals > m.hurts;
});
auto it_minus = partition (it_zero, M.end(), [](Monster const& m) {
return m.heals == m.hurts;
});
sort( M.begin(), it_zero, [](Monster const& a, Monster const& b) {
// najpierw walczymy z najlatwiejszymi; kazda walka poprawia zdrowie
return a.hurts < b.hurts;
});
sort( it_minus, M.end(), [](Monster const& a, Monster const& b) {
// to samo w grupie plus, tylko na odwrot
return a.heals > b.heals;
});
};
bool win(int health, monsters_t const& M)
{
for( auto duel : M ) {
health -= duel.hurts;
if ( health <= 0 ) return false;
health += duel.heals;
}
return true;
}
int main()
{
int health;
monsters_t M;
read_data( health, M );
prepare_fights( M );
if( win(health, M ) ) {
cout << "TAK\n";
cout << M << endl;
}
else {
cout << "NIE\n";
}
}
ostream& operator<< (ostream& os, monsters_t const& M )
{
for( auto const e : M ) {
os << e.idx;
if( e.idx != M.back().idx ) os << " ";
}
return os;
};
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 | #include <iostream> #include <algorithm> #include <vector> using namespace std; struct Monster { int idx; int hurts; int heals; }; typedef vector< Monster > monsters_t; ostream& operator<< (ostream&, monsters_t const&); void read_data(int& health, monsters_t& M) { int num_creatures; cin >> num_creatures >> health; for ( int i = 0; i < num_creatures; ++i ) { Monster m; m.idx = i + 1; cin >> m.hurts; cin >> m.heals; M.push_back( m ); } } void prepare_fights(monsters_t& M) { auto it_zero = partition ( M.begin(), M.end(), [](Monster const& m) { return m.heals > m.hurts; }); auto it_minus = partition (it_zero, M.end(), [](Monster const& m) { return m.heals == m.hurts; }); sort( M.begin(), it_zero, [](Monster const& a, Monster const& b) { // najpierw walczymy z najlatwiejszymi; kazda walka poprawia zdrowie return a.hurts < b.hurts; }); sort( it_minus, M.end(), [](Monster const& a, Monster const& b) { // to samo w grupie plus, tylko na odwrot return a.heals > b.heals; }); }; bool win(int health, monsters_t const& M) { for( auto duel : M ) { health -= duel.hurts; if ( health <= 0 ) return false; health += duel.heals; } return true; } int main() { int health; monsters_t M; read_data( health, M ); prepare_fights( M ); if( win(health, M ) ) { cout << "TAK\n"; cout << M << endl; } else { cout << "NIE\n"; } } ostream& operator<< (ostream& os, monsters_t const& M ) { for( auto const e : M ) { os << e.idx; if( e.idx != M.back().idx ) os << " "; } return os; }; |
English