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を削除。