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