|
今日はTopCoderのSRM492DIV2の問題を解きました。
コンテストに参加しないでも問題を解けて、頭のいい人たちのプログラムを見ることができるのもTopCoderのいいところですね。 【問題】 ワインセラーを持っているゴーゴさんがタイムマシンを発明しました。タイムマシンを使って数個のワインセラーを未来の状態にすることができるのですが、数個のワインセラーを成熟させるとそれ以外の中の数個のワインセラーは成長しなくなってしまいます。ゴーゴさんはどの組み合わせでワインセラーを成熟させると最も利益が出るでしょう?という問題です。 引数が利益の出る値の配列と戻さないといけないセラーの数の配列です。 戻り値は最大の利益を返します。 【解法】 この問題で注目すべき点は利益と損失の差が最大になる組み合わせを探すことと、同じワインセラーを成長させたり、退化させたりできないという点だけですね。2重ループのfor文などを使って組み合わせを探していきます。 【フローチャート】 ワインセラーの数を知る。hairetu.lengthを使う。 ↓ for文の2重ループで利益と損失の差を求めていく。 このとき、同じワインセラーは調べない ↓ 差が最大になった値(最大の利益を)戻り値として返す 【プログラム例】 import java.util.*; public class TimeTravellingCellar{ public int determineProfit(int[] profit, int[] decay){ int N = profit.length; int ans = Integer.MIN_VALUE; //最大値を探すので最小の値を入れておく for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ if(i != j)ans = Math.max(ans, profit[i] - decay[j]); //2つの値を比べて最大の方を返す } } return ans; } } 【感想】 英文がちゃんと理解できたらなんてことのない問題でした。ですが高得点をとれるような高率のよいきれいなプログラムというのがいまだよくわかりません。しばらくは頭のいい人たちの真似をして技を盗んでいきたいと思います。 |

- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- ソフトウェア





