このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。
マナオはすべての商品が正の整数の価格を持つ国に住んでいる。彼は電子レンジを売る会社を立ち上げており、それらを売るのに最適な価格を決める必要がある。最近彼は新しい心理学的な発見を聞いた。それは価格の小さい方の桁に9が続くにつれて、消費者に魅力的になるというものである。たとえば9099は9が2つ、8909は1つ9が最後にあるので、前者が魅力的ということになる。
マナオはminPriceを下回らない価格でのみ売る余裕があり、消費者はmaxPriceを超えない価格でしか電子レンジを買わないということを把握している。minPriceとmaxPriceの間で9が最大限後ろに続く数のうち最大のものを見つけることでマナオを手助けせよ。
public class MicrowaveSelling { public int mostAttractivePrice(int minPrice, int maxPrice) { int nNine = 0; int price = minPrice; for( int i=minPrice ; i<=maxPrice ; i++ ) { int nCurrent = trailing(i, 9); if( nCurrent >= nNine ) { price = i; nNine = nCurrent; } } return price; } private int trailing(int num, int target){ int n = 0; while( num >= 1 ){ if( num % 10 == 9 ){ n++; }else{ return n; } num /= 10; } return n; } }
得点は173.37/250、3回目のsubmitでシステムテストクリア。ちなみにtrailingは「後端の」という意味です。