kmjp's blog

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

KUPC2012 Practice : A - Wikipedia、B - String Sorting

KUPC2013は不参加なので、2012 Practiceと合わせて練習。
http://kupc2012pr.contest.atcoder.jp/tasks/kupc2012pr_1
http://kupc2012pr.contest.atcoder.jp/tasks/kupc2012pr_2

A - Wikipedia

整数値mとnが与えられるのでアッカーマン関数値Ack(m,n)を答えよ。

これ、元の定義に従って行うとm=3、n=60でもとても終わらない。
しかしこれはWikipediaへのリンク自体がヒントになっており、Ack(3,n)=2**(n+3)-3と一般項が取れるので、これを使うと良い。

自分はWikipediaの一般項の項目を見落としていて、自分でAck(3,n)の一般項を推測するはめに。

ll ack(int m,int n) {
	if(m==0) return n+1;
	if(n==0) return ack(m-1,1);
	if(m==3) return (1LL<<(n+3))-3;
	return ack(m-1,ack(m,n-1));
}

void solve() {
	int f,r,i,j,k,l,x,y,tx,ty;
	int m,n;
	
	cin>>m>>n;
	return (void)_P("%lld\n",ack(m,n));
}

B - String Sorting

K桁の数字がN個与えられる。
これらを連結して得られる最大値を答えよ。

単に数字を文字列として降順ソートしてつなげるだけ。

int N,K;

void solve() {
	int f,r,i,j,k,l,x,y,tx,ty;
	vector<string> V;
	cin>>N>>K;
	FOR(i,N) {
		string s;
		cin>>s;
		V.push_back(s);
	}
	sort(V.begin(),V.end());
	FOR(i,N) cout<<V[N-1-i];
	cout << endl;
	return;
}

まとめ

return (void)hogehoge();
って書き方、無駄な行数減らせていいな。