#include<iostream>
using namespace std;
void merge(int a[], int b[], int c[], int p, int q, int r)
{
int i=p,k=p;
int j=q+1;
while( i<q+1 && j<r+1)
{
if(c[a[i]]>c[a[j]])
b[k++]=a[j++];
else
b[k++]=a[i++];
}
while(i<q+1)
b[k++]=a[i++];
while(j<r+1)
b[k++]=a[j++];
for(int i=p;i<r+1;i++)
a[i]=b[i];
}
void mergesort(int a[], int b[], int c[], int p, int r)
{
if(p>=r)
return;
int q=(p+r)/2;
mergesort(a,b,c,p,q);
mergesort(a,b,c,q+1,r);
merge(a,b,c,p,q,r);
}
void print(int a[], int size)
{
cout<<"( ";
for(int i=1;i<size-1;i++)
cout<<a[i]<<", ";
cout<<a[size-1]<<")"<<endl;
}
int main()
{
ios_base::sync_with_stdio(0);
int n, z;
cin>>n>>z;
int d[n+1],a[n+1];
int wynik[n+1];
int temp[n+1];
int indeks=1;
for(int i=1;i<n+1;i++)
{
cin>>d[i]>>a[i];
if(a[i]-d[i]>=0)
wynik[indeks++]=i;
}
mergesort(wynik,temp,d,1,indeks-1);
int licznik=indeks;
for(int i=1;i<n+1;i++)
{
if(a[i]-d[i]<0)
wynik[licznik++]=i;
}
mergesort(wynik,temp,d,indeks,n);
for(int i=indeks;i<n+1;i++)
temp[i]=wynik[n+indeks-i];
for(int i=indeks;i<n+1;i++)
wynik[i]=temp[i];
for(int i=1;i<indeks;i++)
{
if(z>d[wynik[i]])
z=z-d[wynik[i]]+a[wynik[i]];
else
{
cout<<"NIE"<<endl;
return 0;
}
}
for(int i=indeks;i<n;i++)
{
if(z>d[wynik[i]])
{
if(z-d[wynik[i]]+a[wynik[i]]>d[wynik[i+1]])
{
if(z-d[wynik[i+1]]+a[wynik[i+1]]>d[wynik[i]] && d[wynik[i+1]]-a[wynik[i+1]]<d[wynik[i]]-a[wynik[i]] && a[wynik[i+1]]>a[wynik[i]])
{
z=z-d[wynik[i+1]]+a[wynik[i+1]];
swap(wynik[i],wynik[i+1]);
}
else
z=z-d[wynik[i]]+a[wynik[i]];
}
else
{
if(z-d[wynik[i+1]]+a[wynik[i+1]]>d[wynik[i]])
{
z=z-d[wynik[i+1]]+a[wynik[i+1]];
swap(wynik[i],wynik[i+1]);
}
else
{
cout<<"NIE"<<endl;
return 0;
}
}
}
else
{
cout<<"NIE"<<endl;
return 0;
}
}
cout<<"TAK"<<endl;
for(int i=1;i<n;i++)
cout<<wynik[i]<<" ";
cout<<wynik[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 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 115 116 117 118 119 120 121 122 123 124 125 126 | #include<iostream> using namespace std; void merge(int a[], int b[], int c[], int p, int q, int r) { int i=p,k=p; int j=q+1; while( i<q+1 && j<r+1) { if(c[a[i]]>c[a[j]]) b[k++]=a[j++]; else b[k++]=a[i++]; } while(i<q+1) b[k++]=a[i++]; while(j<r+1) b[k++]=a[j++]; for(int i=p;i<r+1;i++) a[i]=b[i]; } void mergesort(int a[], int b[], int c[], int p, int r) { if(p>=r) return; int q=(p+r)/2; mergesort(a,b,c,p,q); mergesort(a,b,c,q+1,r); merge(a,b,c,p,q,r); } void print(int a[], int size) { cout<<"( "; for(int i=1;i<size-1;i++) cout<<a[i]<<", "; cout<<a[size-1]<<")"<<endl; } int main() { ios_base::sync_with_stdio(0); int n, z; cin>>n>>z; int d[n+1],a[n+1]; int wynik[n+1]; int temp[n+1]; int indeks=1; for(int i=1;i<n+1;i++) { cin>>d[i]>>a[i]; if(a[i]-d[i]>=0) wynik[indeks++]=i; } mergesort(wynik,temp,d,1,indeks-1); int licznik=indeks; for(int i=1;i<n+1;i++) { if(a[i]-d[i]<0) wynik[licznik++]=i; } mergesort(wynik,temp,d,indeks,n); for(int i=indeks;i<n+1;i++) temp[i]=wynik[n+indeks-i]; for(int i=indeks;i<n+1;i++) wynik[i]=temp[i]; for(int i=1;i<indeks;i++) { if(z>d[wynik[i]]) z=z-d[wynik[i]]+a[wynik[i]]; else { cout<<"NIE"<<endl; return 0; } } for(int i=indeks;i<n;i++) { if(z>d[wynik[i]]) { if(z-d[wynik[i]]+a[wynik[i]]>d[wynik[i+1]]) { if(z-d[wynik[i+1]]+a[wynik[i+1]]>d[wynik[i]] && d[wynik[i+1]]-a[wynik[i+1]]<d[wynik[i]]-a[wynik[i]] && a[wynik[i+1]]>a[wynik[i]]) { z=z-d[wynik[i+1]]+a[wynik[i+1]]; swap(wynik[i],wynik[i+1]); } else z=z-d[wynik[i]]+a[wynik[i]]; } else { if(z-d[wynik[i+1]]+a[wynik[i+1]]>d[wynik[i]]) { z=z-d[wynik[i+1]]+a[wynik[i+1]]; swap(wynik[i],wynik[i+1]); } else { cout<<"NIE"<<endl; return 0; } } } else { cout<<"NIE"<<endl; return 0; } } cout<<"TAK"<<endl; for(int i=1;i<n;i++) cout<<wynik[i]<<" "; cout<<wynik[n]; return 0; } |
English