kmjp's blog

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

CODE FESTIVAL 2014 決勝 : A - 50m走、B - 暗算ゲーム、C - N進数

オープンで参加。
先行逃げ切りで良い順位だったけど、もう1問は解けたかった。
http://code-festival-2014-final-open.contest.atcoder.jp/tasks/code_festival_final_a
http://code-festival-2014-final-open.contest.atcoder.jp/tasks/code_festival_final_b
http://code-festival-2014-final-open.contest.atcoder.jp/tasks/code_festival_final_c

A - 50m走

50メートル走のタイムsが与えられる。
平均秒速は何メートル毎秒か。

割るだけ。

void solve() {
	int i,j,k,l,r,x,y; string s;
	cin>>i;
	_P("%.12lf\n",50.0/(double)i);
}
|||<

*B - 暗算ゲーム

ある整数が与えられる。
上から奇数桁目の数値を足し、偶数桁目の数値を引く時、最終的に得られる数値はいくらか。

これもやるだけ。

>|cpp|
void solve() {
	int i,j,k,l,r,x,y; string s;
	cin>>s;
	x=0;
	FOR(i,s.size()) {
		if(i%2) x-=(s[i]-'0');
		else x+=(s[i]-'0');
	}
	cout << x << endl;
}

C - N進数

f(x)とは、x進数表示で"x"を表現した値を指す。
例えばf(23)=23*2+3=49である。
整数Aが与えられたとき、f(x)=Aとなるような10以上のxはあるか。

xを総当たりしてf(x)を求めればよい。

ll f(ll v) {
	ll t=0;
	ll vv=1,ov=v;;
	while(v>0) {
		t+=vv*(v%10);
		vv*=ov;
		v/=10;
		if(t>10000000000000000LL) return -1;
	}
	return t;
}

void solve() {
	int i,j,k,l,r,x,y; string s;
	ll A,B;
	cin>>A;
	for(B=10;;B++) {
		if(f(B)==A) return _P("%lld\n",B);
		if(f(B)<0) break;
	}
	_P("-1\n");
}

まとめ

このあたりはまだ簡単。