1064 Cable master
1064 -- Cable master
N(1<=N<=10000)本の長さのまちまちなケーブル(1m以上、100km以内。単位はセンチメートル)から、同じ長さのK(1<=K<=10000)本の短いケーブルを切り出すことを考える。ただし二つの短いケーブルをつなげて一本にすることは出来ない。このとき、もっとも長く切り出せるケーブルの長さを小数第二位までのメートルで求めるというもの。
GCCで148byte。
(追記)id:kurimuraさんのソースをパクって133byte。
float a,z['((']; b,i; main(c){ for(;~scanf("%f",z+i++);); for(b=1<<24;a+=b/=2,b;c<z[1]?a-=b:0) for(i=c=0;z[++i];) c+=z[i+1]*100/a; printf("%.2f\n",a/1e2); }
1ずつインクリメントしていては間に合わない(kosakが実験済み)ので、各ビットを立てたり下げたりしながら調べる。バイナリサーチの方が少しループ回数が少ないけど、これで十分。
2^24=16777216>100*1000*100なので、floatでも大丈夫でした。でも10進の小数を読み込んでいるので、運の悪いテストケースだと死ぬのかな?
(追記)id:kurimuraさんのソースをパクって133byte。
ついかっとなってやってしまった。今は反省している。
float*y,z['(('],a; main(c,b){ for(;~scanf("%f",z-c--);); for(;b*=.7;a+=c<*z?0:b) for(c=0,y=z;*++y;) c+=*y*100/(a+b); printf("%.2f",a/1e2); }
改行抜いたのと、変数yの追加により変数iを削除。