记录编号 |
141929 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[国家集训队 2011] 跳跳棋 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}