记录编号 141929 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2011] 跳跳棋 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2014-12-05 08:28:42 内存使用 0.31 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x7fffffff/2;
class STATE{
public:
	int a[4];
	int dep;
	void print(void){printf("%d %d %d\n",a[1],a[2],a[3]);}
};
void print(STATE s){s.print();}
bool operator != (STATE a,STATE b){
	for(int i=1;i<=3;i++) if(a.a[i]!=b.a[i]) return true;
	return false;
}
STATE calc(STATE &s,int k){//状态s向根走k步
	STATE ans=s;
	int t1=s.a[2]-s.a[1],t2=s.a[3]-s.a[2];
	if(t1==t2) return ans;
	if(t1<t2){
		int t=min(k,(t2-1)/t1);
		k-=t;ans.dep+=t;
		ans.a[2]+=t*t1;ans.a[1]+=t*t1;
	}
	else{
		int t=min(k,(t1-1)/t2);
		k-=t;ans.dep+=t;
		ans.a[2]-=t*t2;ans.a[3]-=t*t2;
	}
	if(k) return calc(ans,k);
	else return ans;
}
STATE u,v;
void work(void){
	STATE g1=calc(u,INF),g2=calc(v,INF);
	if(g1!=g2){
		printf("NO\n");
		return;
	}
	if(g1.dep>g2.dep) swap(u,v),swap(g1,g2);//保证v的深度较大
	int ans=g2.dep-g1.dep;
	v=calc(v,ans);//先补齐
	int l=0,r=g1.dep;
	while(l<r){
		int mid=(l+r)>>1;
		if(calc(u,mid)!=calc(v,mid)) l=mid+1;
		else r=mid;
	}
	printf("YES\n");
	printf("%d\n",ans+2*l);
}
void read(void){
	for(int i=1;i<=3;i++) scanf("%d",&u.a[i]);
	for(int i=1;i<=3;i++) scanf("%d",&v.a[i]);
	sort(u.a+1,u.a+4);sort(v.a+1,v.a+4);
	u.dep=v.dep=0;
}
int main(){
	freopen("nt2011_hop.in","r",stdin);
	freopen("nt2011_hop.out","w",stdout);
	read();
	work();
	return 0;
}