3085 Quick Change

3085 Quick Change


25, 10, 5, 1セント硬貨があって、お釣りを最少の枚数の硬貨で
返す方法を考える問題。


例えば、お釣りが194セントなら、25セント7枚、10セント1枚、
5セント1枚、1セント1枚を返す。


単純に大きい額の硬貨から選んでいけばよい。
(以前ororogから似たような問題の話を聞かされていて、
確か12,5,1という架空の通貨があって、お釣りが15の場合は、
単純にやると12,1,1,1で4枚になるが、5,5,5で3枚の方が
少なくなる、というものだったが、セントは実用されている
通貨だし、こんなことはなかった)


ACは簡単にもらえたので、コードゴルフなるものに挑戦してみた。


コードゴルフとはとにかく少ないバイト数でコーディングする遊びで、
可読性など気にしない。includeはしないし、変数はグローバルで宣言する
(型宣言がいらないため)


PKUでせっせとCode Lengthを削っている人達がいるのは知っていたけど、
わざわざ変な文法で書いてみる必要もないと思ってスルーしていた。


…が、いざやってみると意外とためになる!
コードを削るには削ってもいい箇所を見極める必要があって、
それにはCなりC++なりの深い知識が必要だから。


例えば複文{...}について、{文1;文2;文3}を文1,文2,文3と書いて'{'と'}'の2バイト削るというテクとか、

for(a;b;)
 c,d;

for(a;b;d)
 c;

って書いて1バイト削るテクとか。
これなんかは単にコードゴルフのテクニックとしてだけじゃなくて、
センスのいいfor文が書けるようになりそうだし。

for (int i = 0; i < N; ++i, その他の更新) {
 ...
}

みたいな。

結局3085に関しては159Bで6/2551位だった。

n;main(N,C){scanf("%d",&N);for(;n<N;printf("%d %d QUARTER(S), %d DIME(S), %d NICKEL(S), %d PENNY(S)\n",++n,C/25,C%25/10,C%25%10/5,C%25%10%5))scanf("%d",&C);}

まだまだ無駄があるはず!…だけど今の知識じゃこれが限界><
本当は(C%=25)/10,(C%=10)/5,...みたいにやりたいんだけどこれはダメぽい。。。