#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; } |
English