このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についてざっくりと説明する。
複数のファイルをインターネットからダウンロードしようとしている。各ファイルのダウンロード状況について、"ダウンロード中の速度 ダウンロードにかかる時間"という形式で文字列型配列が与えられる。あるファイルのダウンロードが終わると、利用していた帯域は残りのファイルをダウンロードに割り当てられることができる。そのため、途中でダウンロード中の速度は上がり、ダウンロードにかかる時間は短くなる。さて、ある時点におけるダウンロード状況が与えられたとき、実際にかかる時間を計算して返すメソッドを作成せよ。
私の解答はこちら。
public class DownloadingFiles {
public double actualTime(String[] tasks) {
int speed = 0;
int time = 0;
int fileSize = 0;
for( int i=0 ; i<tasks.length ; i++ ){
String[] tmp = tasks[i].split(" ");
speed += Integer.parseInt(tmp[0]);
time += Integer.parseInt(tmp[1]);
fileSize += Integer.parseInt(tmp[0]) * Integer.parseInt(tmp[1]);
}
return (double)fileSize/speed;
}
}得点は234.20/250、1回のsubmitでシステムテストクリア。初見で帯域をどうやって割り振っていいか理解できず、ぎょっとしたものの、そのようなことを考える必要はなく、ファイルサイズの合計/バンド幅(というか速度の合計)で求まるというオチ。

0 件のコメント:
コメントを投稿