这题太神了,还是Orz黄学长吧。
要善于将复杂的问题抽象成合适的模型。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int inf=1000000007;
int a[5],b[5];
int deep;
struct node
{
int a[5];
int& operator[](int x)
{
return a[x];
}
};
node UP(int *a,int k)
{
node ans;
int t1=a[2]-a[1],t2=a[3]-a[2];
for (int i=1;i<=3;i++) ans[i]=a[i];
if (t1==t2) return ans;
if (t1>t2)
{
int t=min(k,(t1-1)/t2);
k-=t; deep+=t;
ans[2]-=t*t2; ans[3]-=t*t2;
}
else
{
int t=min(k,(t2-1)/t1);
k-=t; deep+=t;
ans[2]+=t*t1; ans[1]+=t*t1;
}
if (k) return UP(ans.a,k);
else return ans;
}
inline bool judge(node a,node b)
{
for (int i=1;i<=3;i++)
if (a[i]!=b[i]) return false;
return true;
}
int main()
{
for (int i=1;i<=3;i++)
scanf("%d",&a[i]);
for (int i=1;i<=3;i++)
scanf("%d",&b[i]);
sort(a+1,a+4); sort(b+1,b+4);
deep=0;
node root1=UP(a,inf);
int deep1=deep;
deep=0;
node root2=UP(b,inf);
int deep2=deep;
if (!judge(root1,root2))
{
puts("NO");
return 0;
}
if (deep1>deep2)
{
swap(deep1,deep2);
for (int i=1;i<=3;i++) swap(a[i],b[i]);
}
int base=deep2-deep1;
root2=UP(b,base);
for (int i=1;i<=3;i++) b[i]=root2[i];
int l=0,r=deep1;
while (l<=r)
{
int mid=l+r>>1;
if (!judge(UP(a,mid),UP(b,mid))) l=mid+1;
else r=mid-1;
}
puts("YES");
cout << base+(l<<1) << endl;
return 0;
}