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,...みたいにやりたいんだけどこれはダメぽい。。。