//Ada Kołodziejczak //Zadanie Butelki #include <bits/stdc++.h> using namespace std; int A[4], a[4], sum; int t[100005];//100005 map<pair<int,int>, int> m;//stan, minimalny koszt+1 struct stan{ int a; int b; int val; }; stan bi;//biezacy stan queue<stan> q; void polej(int x, int y, int va, int vb, int v)//skad dokad, aktualny stan { int temp=min(va, A[y]-vb); va-=temp; vb+=temp; if(y==1) swap(va, vb); if(x!=1&&y!=1) { if(x==2) swap(va, vb); va=sum-va-vb; } if(x!=2&&y!=2) vb=sum-va-vb; if(!m[{va,vb}]||v<m[{va,vb}]) { m[{va,vb}]=v; q.push({va,vb,v}); } } int main() { ios_base::sync_with_stdio(0); cin>>A[1]>>A[2]>>A[3]>>a[1]>>a[2]>>a[3]; sum=a[1]+a[2]+a[3]; q.push({a[1],a[2],1}); m[{a[1],a[2]}]=1; t[a[1]]=1; t[a[2]]=1; t[a[3]]=1; while(!q.empty()) { bi=q.front(); q.pop(); if(m[{bi.a, bi.b}]!=bi.val) continue; if(t[bi.a]==0||bi.val<t[bi.a]) t[bi.a]=bi.val; if(t[bi.b]==0||bi.val<t[bi.b]) t[bi.b]=bi.val; if(t[sum-bi.a-bi.b]==0||bi.val<t[sum-bi.a-bi.b]) t[sum-bi.a-bi.b]=bi.val; if(bi.a&&bi.b!=A[2]) polej(1,2,bi.a,bi.b,bi.val+1);//a->b if(bi.a&&sum-bi.b-bi.a!=A[3]) polej(1,3,bi.a,sum-bi.b-bi.a,bi.val+1);//a->c if(bi.b&&bi.a!=A[1]) polej(2,1,bi.b,bi.a,bi.val+1);//b->a if(bi.b&&sum-bi.b-bi.a!=A[3]) polej(2,3,bi.b,sum-bi.b-bi.a,bi.val+1);//b->c if(sum-bi.b-bi.a&&bi.a!=A[1]) polej(3,1,sum-bi.b-bi.a,bi.a,bi.val+1);//c->a if(sum-bi.b-bi.a&&bi.b!=A[2]) polej(3,2,sum-bi.b-bi.a,bi.b,bi.val+1);//c->b } for(int i=0; i<=A[3]; ++i) { cout<<t[i]-1<<" "; } }
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 | //Ada Kołodziejczak //Zadanie Butelki #include <bits/stdc++.h> using namespace std; int A[4], a[4], sum; int t[100005];//100005 map<pair<int,int>, int> m;//stan, minimalny koszt+1 struct stan{ int a; int b; int val; }; stan bi;//biezacy stan queue<stan> q; void polej(int x, int y, int va, int vb, int v)//skad dokad, aktualny stan { int temp=min(va, A[y]-vb); va-=temp; vb+=temp; if(y==1) swap(va, vb); if(x!=1&&y!=1) { if(x==2) swap(va, vb); va=sum-va-vb; } if(x!=2&&y!=2) vb=sum-va-vb; if(!m[{va,vb}]||v<m[{va,vb}]) { m[{va,vb}]=v; q.push({va,vb,v}); } } int main() { ios_base::sync_with_stdio(0); cin>>A[1]>>A[2]>>A[3]>>a[1]>>a[2]>>a[3]; sum=a[1]+a[2]+a[3]; q.push({a[1],a[2],1}); m[{a[1],a[2]}]=1; t[a[1]]=1; t[a[2]]=1; t[a[3]]=1; while(!q.empty()) { bi=q.front(); q.pop(); if(m[{bi.a, bi.b}]!=bi.val) continue; if(t[bi.a]==0||bi.val<t[bi.a]) t[bi.a]=bi.val; if(t[bi.b]==0||bi.val<t[bi.b]) t[bi.b]=bi.val; if(t[sum-bi.a-bi.b]==0||bi.val<t[sum-bi.a-bi.b]) t[sum-bi.a-bi.b]=bi.val; if(bi.a&&bi.b!=A[2]) polej(1,2,bi.a,bi.b,bi.val+1);//a->b if(bi.a&&sum-bi.b-bi.a!=A[3]) polej(1,3,bi.a,sum-bi.b-bi.a,bi.val+1);//a->c if(bi.b&&bi.a!=A[1]) polej(2,1,bi.b,bi.a,bi.val+1);//b->a if(bi.b&&sum-bi.b-bi.a!=A[3]) polej(2,3,bi.b,sum-bi.b-bi.a,bi.val+1);//b->c if(sum-bi.b-bi.a&&bi.a!=A[1]) polej(3,1,sum-bi.b-bi.a,bi.a,bi.val+1);//c->a if(sum-bi.b-bi.a&&bi.b!=A[2]) polej(3,2,sum-bi.b-bi.a,bi.b,bi.val+1);//c->b } for(int i=0; i<=A[3]; ++i) { cout<<t[i]-1<<" "; } } |