kmjp's blog

競技プログラミング参加記です

Codeforces #370 Div2 C. Memory and De-Evolution

今回は不参加。出たらCで詰まってそう…。
http://codeforces.com/contest/712/problem/C

問題

1辺Xの正三角形がある。
この正三角形に対し、1回の処理で1つの辺の長さを整数分だけ短くすることができる。
ただし、処理後の3辺は面積が正の三角形をなしていなければならない。

1辺Xの正三角形から1辺Yの正三角形を作るには、上記処理を最少何回行わなければならないか。

解法

X→Yにすると考えると難しい。
逆にY→Xにすることを考えよう。

今3辺の長さが昇順でA,B,Cとする。
この場合、Aをmin(B+C-1,X)に置き換えて行き、全部がXになるまでの回数を求めればよい。

int X,Y;
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>X>>Y;
	int A[3]={Y,Y,Y};
	
	int ret=0;
	while(A[0]<X) {
		x=A[0];
		A[0]=A[1];
		A[1]=A[2];
		A[2]=min(X,A[0]+A[1]-1);
		ret++;
	}
	cout<<ret<<endl;
	
}

まとめ

シンプルな問題ながら面白かったです。