#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
struct Node{
LL loss;
LL profit;
int realIdx;
bool operator<(const Node& other) const{
return loss < other.loss;
}
};
vector<Node> posVect, negVect;
vector<int> results;
vector<int> backResults;
int n;
int main(){
int z, d, a;
LL life;
scanf("%d%d", &n, &z);
life = z;
for(int i=0; i<n; i++){
scanf("%d%d", &d, &a);
Node node;
node.realIdx = i + 1;
if(a - d >= 0){
node.loss = d;
node.profit = a;
posVect.push_back(node);
}else{
node.loss = a;
node.profit = d;
negVect.push_back(node);
}
}
sort(posVect.begin(), posVect.end());
sort(negVect.begin(), negVect.end());
for(int i=0; i<(int)posVect.size(); i++){
Node &node = posVect[i];
if(node.loss >= life){
printf("NIE\n");
return 0;
}
life += node.profit - node.loss;
results.push_back(node.realIdx);
}
LL endLife = life;
for(int i=0; i<(int)negVect.size(); i++)
endLife += negVect[i].loss - negVect[i].profit;
if(endLife <= 0){
printf("NIE\n");
return 0;
}
for(int i=0; i<(int)negVect.size(); i++){
Node &node = negVect[i];
if(node.loss >= endLife){
printf("NIE\n");
return 0;
}
endLife += node.profit - node.loss;
backResults.push_back(node.realIdx);
}
printf("TAK\n");
for(int i=0; i<(int)results.size(); i++)
printf("%d ", results[i]);
for(int i=(int)backResults.size()-1; i>=0; i--)
printf("%d ", backResults[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 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef long long LL; struct Node{ LL loss; LL profit; int realIdx; bool operator<(const Node& other) const{ return loss < other.loss; } }; vector<Node> posVect, negVect; vector<int> results; vector<int> backResults; int n; int main(){ int z, d, a; LL life; scanf("%d%d", &n, &z); life = z; for(int i=0; i<n; i++){ scanf("%d%d", &d, &a); Node node; node.realIdx = i + 1; if(a - d >= 0){ node.loss = d; node.profit = a; posVect.push_back(node); }else{ node.loss = a; node.profit = d; negVect.push_back(node); } } sort(posVect.begin(), posVect.end()); sort(negVect.begin(), negVect.end()); for(int i=0; i<(int)posVect.size(); i++){ Node &node = posVect[i]; if(node.loss >= life){ printf("NIE\n"); return 0; } life += node.profit - node.loss; results.push_back(node.realIdx); } LL endLife = life; for(int i=0; i<(int)negVect.size(); i++) endLife += negVect[i].loss - negVect[i].profit; if(endLife <= 0){ printf("NIE\n"); return 0; } for(int i=0; i<(int)negVect.size(); i++){ Node &node = negVect[i]; if(node.loss >= endLife){ printf("NIE\n"); return 0; } endLife += node.profit - node.loss; backResults.push_back(node.realIdx); } printf("TAK\n"); for(int i=0; i<(int)results.size(); i++) printf("%d ", results[i]); for(int i=(int)backResults.size()-1; i>=0; i--) printf("%d ", backResults[i]); return 0; } |
English