SRM 296 DIV1 Easy - NewAlbum (復習×○)

問題


http://community.topcoder.com/stat?c=problem_statement&pm=6085&rd=9817

・与えられた曲を全てCDに収録したい。
・曲の長さは全て同じ秒数。
・1つのCDに入れられる秒数も決められている。
・CDに収録する際、曲の間には必ず1秒空けなければいけない。
・ただし、1つのCDに収録される曲数は13の倍数になってはいけない。

曲の長さと1つのCDに入れられる秒数、全曲数が与えられた時、
必要なCDの最小数を求める。

解き方


数学的に解くことができるが、少しトリッキー。
CDに入れられる曲数だけめいっぱい入れていき、
最後に余った曲数に対して、13の倍数でなければ1曲のみ他のCDに移せばよいので、答えはCDに入れられる曲数で割った数になる。
13の倍数のとき、他のCDがないとき、もしくは1引いたときその数が13の倍数になるときは新たなCDに焼かなければいけないので+1となる。

上記のように少し考察が必要だが、dpで解けば簡単に解くことができる。

文字列のdpと同様1次元配列を用い、
その曲数までの最小CD数を求めてあげればよい。

コード


class NewAlbum {

public: int leastAmountOfCDs(int nSongs, int length, int cdCapacity) {
int dp[nSongs+1];
int num=(cdCapacity+1)/(length+1);

dp[0]=0;
FORE(i,1,nSongs+1){
dp[i]=100000;
FORE(j,1,min(num,i)+1)if(j%13!=0)dp[i]=min(dp[i],1+dp[i-j]);
}

return dp[nSongs];
}

};
このエントリーをはてなブックマークに追加