贪心学习笔记
将三颗棋子从左往右的顺序设计为状态,分析题目并得出状态只有三种转移方式,将其抽象为二叉树形态,并通过近似LCA的方式求解
#include<bits/stdc++.h>
using namespace std;
struct Ty{
int a,b,c;
bool operator ==(const Ty &u)const{return a==u.a&&b==u.b&&c==u.c;}
bool operator !=(const Ty &u)const{return a!=u.a||b!=u.b||c!=u.c;}
};
void Swap(Ty &u){
if(u.a>u.b)swap(u.a,u.b);
if(u.b>u.c)swap(u.b,u.c);
if(u.a>u.b)swap(u.a,u.b);
return;
}
int DEP(Ty &u,int p){
while(p){
int d1=u.b-u.a,d2=u.c-u.b;
if(d1==d2)return p;
if(d1<d2){
int d3=(d2-1)/d1;
if(d3<p){
u.a+=d1*d3;
u.b+=d1*d3;
p-=d3;
}
else{
u.a+=d1*p;
u.b+=d1*p;
p=0;
}
}
else{
int d3=(d1-1)/d2;
if(d3<p){
u.b-=d2*d3;
u.c-=d2*d3;
p-=d3;
}
else{
u.b-=d2*p;
u.c-=d2*p;
p=0;
}
}
}
return 0;
}
signed main(){
Ty a,b;
scanf("%d%d%d%d%d%d",&a.a,&a.b,&a.c,&b.a,&b.b,&b.c);
Swap(a);
Swap(b);
Ty A=a,B=b;
int depa=2e9-DEP(A,2e9),depb=2e9-DEP(B,2e9);
if(A!=B){
printf("NO\n");
return 0;
}
printf("YES\n");
A=a;
B=b;
if(depa<depb){
swap(depa,depb);
swap(A,B);
}
DEP(A,depa-depb);
int l=0,r=1e9;
while(l<r){
int mid=(l+r)/2;
a=A;
b=B;
DEP(a,mid);
DEP(b,mid);
if(a==b)r=mid;
else l=mid+1;
}
printf("%d",l*2+depa-depb);
return 0;
}

浙公网安备 33010602011771号