このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
いくつかのコンテナが1列に並んでおり、パッケージをそれらに入れたいと思っている。最初のコンテナに最初のパッケージを入れることから始める。すべてのパッケージがコンテナに入るまで、以下のことを行う。
- もしパッケージがコンテナに収まらないなら、ステップ3へ行く、そうでなければ次のステップへ行く。
- パッケージをコンテナにつめる。次のパッケージを手に取り、ステップ1へいく。
- コンテナにこれ以上パッケージを詰められなければ現在のコンテナを追いやる。ラインから次のコンテナを取り、ステップ1へ戻る。
私の解答はこちら。
public class Containers { public int wastedSpace(int[] containers, int[] packages) { int cPos = 0; // 注目するcontainer int pPos = 0; // 注目するpackage while( true ){ int capacity = containers[cPos]; int total = 0; boolean isFinish = false; // packageの終わりに辿りついたらtrueになる while( true ){ if( pPos == packages.length ){ isFinish = true; break; } if( total + packages[pPos] > capacity ){ break; }else{ total += packages[pPos++]; } } if( isFinish ) break; cPos++; } int sumContainer = 0; for( int i=0 ; i<containers.length ; i++ ) sumContainer += containers[i]; int sumPackage = 0; for( int i=0 ; i<packages.length ; i++ ) sumPackage += packages[i]; return sumContainer - sumPackage; } }
得点は187.11/250、中央値は約216点。1回のsubmitでシステムテストクリア。実はうすうす気づいていたが、単純にコンテナの合計-パッケージの合計でよいのである。制約には「必ず収まる」という条件がついているので、何番目に入れるとか考えなくてもよい。まさかと思いつつも、面倒な実装に走ってしまったのでした。
0 件のコメント:
コメントを投稿