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();
って書き方、無駄な行数減らせていいな。