#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
struct Comparator {
bool operator()(const pair<int, pair<int, int> >& p1, const pair<int, pair<int, int> >& p2)
{
return p1.second.first < p2.second.first;
}
} comp_d;
struct Comparator_a {
bool operator()(const pair<int, pair<int, int> >& p1, const pair<int, pair<int, int> >& p2)
{
return p1.second.second < p2.second.second;
}
} comp_a;
int main()
{
int n, z, d, a;
int index = 1;
vector< pair<int, pair<int, int>> > dodatnie;
vector< pair<int, pair<int, int>> > ujemne;
pair< int, pair<int, int>> p;
vector<int> indeksy;
scanf("%d %d", &n, &z);
while(n--)
{
scanf("%d %d", &d, &a);
//d obrazenia, a - zdrowie
if(d <= a)
{
p = make_pair(index, make_pair(d, a));
dodatnie.push_back(p);
}
else
{
p = make_pair(index, make_pair(d, a));
ujemne.push_back(p);
}
index++;
}
stable_sort(dodatnie.begin(), dodatnie.end(), comp_d);
stable_sort(dodatnie.begin(), dodatnie.end(), comp_a);
int i;
while(!dodatnie.empty())
{
i = dodatnie.size() - 1;
while(dodatnie[i].second.first >= z)
{
i--;
if(i < 0)
{
printf("NIE\n");
return 0;
}
}
//cout << "Potwor: " << dodatnie[i].second.first << " " << dodatnie[i].second.second << endl;
z -= dodatnie[i].second.first;
z += dodatnie[i].second.second;
//cout << "Aktualne zdrowie: " << z << endl;
indeksy.push_back(dodatnie[i].first);
dodatnie.erase(dodatnie.begin() + i);
}
stable_sort(ujemne.begin(), ujemne.end(), comp_d);
stable_sort(ujemne.begin(), ujemne.end(), comp_a);
while(!ujemne.empty())
{
i = ujemne.size() - 1;
while(ujemne[i].second.first >= z)
{
i--;
if(i < 0)
{
printf("NIE\n");
return 0;
}
}
//cout << "Potwor: " << ujemne[i].second.first << " " << ujemne[i].second.second << endl;
z -= ujemne[i].second.first;
z += ujemne[i].second.second;
//cout << "Aktualne zdrowie: " << z << endl;
indeksy.push_back(ujemne[i].first);
ujemne.erase(ujemne.begin() + i);
}
cout << "TAK\n";
for(unsigned int i = 0; i < indeksy.size(); ++i)
{
cout << indeksy[i] << " ";
}
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 | #include <cstdio> #include <iostream> #include <vector> #include <queue> #include <algorithm> #include <map> using namespace std; struct Comparator { bool operator()(const pair<int, pair<int, int> >& p1, const pair<int, pair<int, int> >& p2) { return p1.second.first < p2.second.first; } } comp_d; struct Comparator_a { bool operator()(const pair<int, pair<int, int> >& p1, const pair<int, pair<int, int> >& p2) { return p1.second.second < p2.second.second; } } comp_a; int main() { int n, z, d, a; int index = 1; vector< pair<int, pair<int, int>> > dodatnie; vector< pair<int, pair<int, int>> > ujemne; pair< int, pair<int, int>> p; vector<int> indeksy; scanf("%d %d", &n, &z); while(n--) { scanf("%d %d", &d, &a); //d obrazenia, a - zdrowie if(d <= a) { p = make_pair(index, make_pair(d, a)); dodatnie.push_back(p); } else { p = make_pair(index, make_pair(d, a)); ujemne.push_back(p); } index++; } stable_sort(dodatnie.begin(), dodatnie.end(), comp_d); stable_sort(dodatnie.begin(), dodatnie.end(), comp_a); int i; while(!dodatnie.empty()) { i = dodatnie.size() - 1; while(dodatnie[i].second.first >= z) { i--; if(i < 0) { printf("NIE\n"); return 0; } } //cout << "Potwor: " << dodatnie[i].second.first << " " << dodatnie[i].second.second << endl; z -= dodatnie[i].second.first; z += dodatnie[i].second.second; //cout << "Aktualne zdrowie: " << z << endl; indeksy.push_back(dodatnie[i].first); dodatnie.erase(dodatnie.begin() + i); } stable_sort(ujemne.begin(), ujemne.end(), comp_d); stable_sort(ujemne.begin(), ujemne.end(), comp_a); while(!ujemne.empty()) { i = ujemne.size() - 1; while(ujemne[i].second.first >= z) { i--; if(i < 0) { printf("NIE\n"); return 0; } } //cout << "Potwor: " << ujemne[i].second.first << " " << ujemne[i].second.second << endl; z -= ujemne[i].second.first; z += ujemne[i].second.second; //cout << "Aktualne zdrowie: " << z << endl; indeksy.push_back(ujemne[i].first); ujemne.erase(ujemne.begin() + i); } cout << "TAK\n"; for(unsigned int i = 0; i < indeksy.size(); ++i) { cout << indeksy[i] << " "; } return 0; } |
English