https://vjudge.net/problem/UVA-607
質問の意味:あなたが教授されている、あなたの話題Nを与え、各トピックはについて話していたが、また、話す、長いLとして各レッスンを踊ることはできません、Tuotang許可されますが、議論のための残り時間があるかもしれません、
しかし、あまり時間が残っている、または他の生徒たちは幸せではありません。次のように不幸式です。
tは残り時間であり、Cは不幸度です。、当然の合計数は、最小をとる完成tpoic Nを検索し、最小度合いの学生は、満足していません。
1:貪欲得ることができるコースの総数の最小値を過ごします。
2:学生不幸度の最小値。
DP [i]は不幸な最低限度の前に、i番目のトピックを示して設定してください。
次いで、[I] =分(DP [J-1] +コスト(トピック[J] + ... +トピック[I]))(トピック[J] + ... +トピックをDP [I])<= L
:COUT; 使用して std ::てendl; 使用してのstd :: cinをします。 使用してのstd ::マップを。 使用してのstd ::ベクトルを、 使用してのstd :: 文字列を。 使用してのstd ::並べ替えを。 使用してのstd :: PRIORITY_QUEUEを。 使用してのstd ::大きいを。 使用してのstd ::ベクトルを、 使用してのstd ::スワップを。 使用してのstd ::を積み重ねます。 使用してのstd ::ビットセットを。 使用してのstd ::にstringstreamを。 constexprののint型の N = 1005 ; int型のn; int型の話題[N]; INT LEC [N]。 INT DP [N]。 int型のL、C。 INTのコスト(int型 L、int型 C、int型の合計) { int型 、T = L - 和。 もし(Tの== 0 ) { 戻り 0 。 } そう であれば(1 <= T && T <= 10 ) { リターン - C。 } 戻り(T - 10)*(T - 10 ); } ボイド解く() { int型T = 0 。 一方、(CIN >> N) { 場合(N == 0 ) { 破ります。 } CIN >> L >> C。 以下のために(int型 i = 1 ; iが<= N; iは++ ) { CIN >> トピック[I]。 } LEC [ 0 ] = 0 。 DP [ 0 ] = 0 ; 以下のための(int型I = 1 ; I <= N; I ++は) { LEC [I] = LEC [I - 1。 ] + 1 ; DP [I] = DP [I - 1 ] + コスト(L、C、トピック[I])。 INT SUM = トピック[I]、 のための(int型 J = I - 1。 ; J> = 0 ; J、 ) { int型ヴァルDP = [J] + コスト(L、C、SUM); // の最小と貪欲もちろん IF(LEC [I]> LEC [J] + 。1 ) { LEC [I] = LEC [J] + 1 ; DP [I] = ヴァル; } // DP、コースの同じ数、不幸の最小次数 他 IF(LEC [I] == LEC [J] + 1。 && DP [I]> ヴァル) { DP [I] = ヴァル; } SUM = SUM + トピック[J]; IF(SUM> L) BREAK ; } } IF!(T = 0 ) { COUT << ENDL。 } ++ T。 裁判所未満 << " ケース" <<トン<< " :" << てendl; COUT << " 講義の最小数:" << LEC [N] << ENDL。 裁判所未満 << " トータル不満インデックス:" << DP [n]は<< てendl; } } }。 D://1.text " " R 」、STDIN); #endifの // !ONLINE_JUDGEの ccは::解く(); を返す 0 ; }
入力:
6 30 15 10 10 10 10 10 10 10 120 10 80 80 10 50 30 20 40 30 120 100 0
出力:
ケース1 : 講義の最小数:2 総不満インデックス:0
ケース2 : 講義の最小数:6 総不満インデックス:2700