#include <bits/stdc++.h> using namespace std; int A[3]; struct butle { int a[3],n; butle(int a[],int n):n(n) { for (int i=0;i<3;i++) this->a[i]=a[i]; } butle(){n=0;} bool operator ()(butle b1, butle b2) const { if (b1.a[0]==b2.a[0]) if (b1.a[1]==b2.a[1]) return b1.a[2]<b2.a[2]; else return b1.a[1]<b2.a[1]; else return b1.a[0]<b2.a[0]; } }; ostream & operator<<(ostream &o, const butle &b) { return o << b.n << " ("<<b.a[0]<<","<<b.a[1]<<","<<b.a[2]<<")\n"; } set<butle,butle> s; set<butle>::iterator sit; pair<set<butle>::iterator, bool> ret; butle przelew(butle b, int i,int j) { int k = min(b.a[i],A[j]-b.a[j]); b.a[i]-=k; b.a[j]+=k; b.n++; return b; } int main() { ios_base::sync_with_stdio(0); for (int i=0;i<3;i++) cin >> A[i]; int C=A[2]; butle b; int suma=0; for (int i=0;i<3;i++) { cin >> b.a[i]; suma+=b.a[i];} for (int i=0;i<3;i++) A[i]=min(A[i],suma); //cout << A[0]<<" "<<A[1]<<" "<<A[2]<< endl; vector<int> answer(C+1,-1); s.insert(b); queue<butle> q; q.push(*s.begin()); while (!q.empty()) { butle p = q.front(); q.pop(); for (int i=0;i<3;i++) if (answer[p.a[i]]<0) answer[p.a[i]]=p.n; for (int i=0;i<3;i++) for (int j=0;j<3;j++) { if (i==j) continue; butle b = przelew(p,i,j); ret = s.insert(b); if (ret.second) q.push(b); } } //for (sit=s.begin();sit!=s.end();sit++) cout << *sit; for (int i=0;i<=C;i++) cout << answer[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 | #include <bits/stdc++.h> using namespace std; int A[3]; struct butle { int a[3],n; butle(int a[],int n):n(n) { for (int i=0;i<3;i++) this->a[i]=a[i]; } butle(){n=0;} bool operator ()(butle b1, butle b2) const { if (b1.a[0]==b2.a[0]) if (b1.a[1]==b2.a[1]) return b1.a[2]<b2.a[2]; else return b1.a[1]<b2.a[1]; else return b1.a[0]<b2.a[0]; } }; ostream & operator<<(ostream &o, const butle &b) { return o << b.n << " ("<<b.a[0]<<","<<b.a[1]<<","<<b.a[2]<<")\n"; } set<butle,butle> s; set<butle>::iterator sit; pair<set<butle>::iterator, bool> ret; butle przelew(butle b, int i,int j) { int k = min(b.a[i],A[j]-b.a[j]); b.a[i]-=k; b.a[j]+=k; b.n++; return b; } int main() { ios_base::sync_with_stdio(0); for (int i=0;i<3;i++) cin >> A[i]; int C=A[2]; butle b; int suma=0; for (int i=0;i<3;i++) { cin >> b.a[i]; suma+=b.a[i];} for (int i=0;i<3;i++) A[i]=min(A[i],suma); //cout << A[0]<<" "<<A[1]<<" "<<A[2]<< endl; vector<int> answer(C+1,-1); s.insert(b); queue<butle> q; q.push(*s.begin()); while (!q.empty()) { butle p = q.front(); q.pop(); for (int i=0;i<3;i++) if (answer[p.a[i]]<0) answer[p.a[i]]=p.n; for (int i=0;i<3;i++) for (int j=0;j<3;j++) { if (i==j) continue; butle b = przelew(p,i,j); ret = s.insert(b); if (ret.second) q.push(b); } } //for (sit=s.begin();sit!=s.end();sit++) cout << *sit; for (int i=0;i<=C;i++) cout << answer[i] << " "; return 0; } |