#include <cstdio> #include <algorithm> #include <vector> using namespace std; long long z; int n,a,d,k,x,y,l=0; int u1[100002]; int u2[100002]; bool czyZnal=false; int main() { scanf("%d%lld", &n, &z); k=n-1; vector <pair< pair <int,int> , int> > dodatnie; vector <pair< pair <int,int> , int> > ujemne; int kol[n]; for(int i=1; i<=n; ++i) { scanf("%d%d", &d, &a); if(a<d) ujemne.push_back(make_pair(make_pair(a-d,d),i)); else dodatnie.push_back(make_pair(make_pair(a-d,d),i)); } x=dodatnie.size(); y=ujemne.size(); sort(&dodatnie[0], &dodatnie[x]); sort(&ujemne[0], &ujemne[y]); k=0; while(z>0) { for(int i=x-1; i>=0; --i) { if(u1[i]==0 && dodatnie[i].first.second<z) { u1[i]=1; z+=dodatnie[i].first.first; kol[k]=dodatnie[i].second; ++k; czyZnal=true; break; } } if(czyZnal==false) break; czyZnal=false; } while(z>0) { for(int i=0; i<y; ++i) { if(u2[i]==0 && ujemne[i].first.second<z) { u2[i]=1; z+=ujemne[i].first.first; kol[k]=ujemne[i].second; ++k; czyZnal=true; break; } } if(czyZnal==false) break; czyZnal=false; } if(k==n) { printf("TAK\n"); for(int i=0; i<n; ++i) printf("%d ", kol[i]); } else { printf("NIE\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 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; long long z; int n,a,d,k,x,y,l=0; int u1[100002]; int u2[100002]; bool czyZnal=false; int main() { scanf("%d%lld", &n, &z); k=n-1; vector <pair< pair <int,int> , int> > dodatnie; vector <pair< pair <int,int> , int> > ujemne; int kol[n]; for(int i=1; i<=n; ++i) { scanf("%d%d", &d, &a); if(a<d) ujemne.push_back(make_pair(make_pair(a-d,d),i)); else dodatnie.push_back(make_pair(make_pair(a-d,d),i)); } x=dodatnie.size(); y=ujemne.size(); sort(&dodatnie[0], &dodatnie[x]); sort(&ujemne[0], &ujemne[y]); k=0; while(z>0) { for(int i=x-1; i>=0; --i) { if(u1[i]==0 && dodatnie[i].first.second<z) { u1[i]=1; z+=dodatnie[i].first.first; kol[k]=dodatnie[i].second; ++k; czyZnal=true; break; } } if(czyZnal==false) break; czyZnal=false; } while(z>0) { for(int i=0; i<y; ++i) { if(u2[i]==0 && ujemne[i].first.second<z) { u2[i]=1; z+=ujemne[i].first.first; kol[k]=ujemne[i].second; ++k; czyZnal=true; break; } } if(czyZnal==false) break; czyZnal=false; } if(k==n) { printf("TAK\n"); for(int i=0; i<n; ++i) printf("%d ", kol[i]); } else { printf("NIE\n"); } return 0; } |