贪心学习笔记

P1852 跳跳棋

将三颗棋子从左往右的顺序设计为状态,分析题目并得出状态只有三种转移方式,将其抽象为二叉树形态,并通过近似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;
}
posted @ 2025-08-18 19:29  Igunareo  阅读(15)  评论(0)    收藏  举报