:
質問の意味:記号は、長い時間のために読むためにタイトルを読んで......
D:
問題の意味:n個のアイテムを考えるとは、すべての項目がボックスにロードされるように、最小の体積を求めて、箱の容積に等しいKです。大型機器にインストールされている大きな箱を満たすために、重大な政策は、小型で満たされていないことができます
ソリューション:答えは私たちの要件を満たしていない:ANS trueの場合、ANS + 1(すなわち、単調を満たしていない)に設定。
以下のサンプルについて
15 5
39 39 39 39 39 60 60 60 60 60 100 100 100 100 10
199は、正当な答えではなく、200、201です。
データの量、直接的な暴力列挙ANS、その後、あなたが満たすことができるかどうかを判断します。
します。https://blog.csdn.net/hlsdbd1990/article/details/46501391に関連する多重集合操作
http://c.biancheng.net/view/545.html
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E3 + 5 。 INTのN、K、[MAXN]、VIS [MAXN]。 BOOL judge1(INT ANS)// 372ms { ソート( +のN)。 以下のために(int型 i = 0 ; iがn <; iは++)VIS [I] = 0 ; 以下のために(int型 i = 0 ; iはK <; iは++ ) { int型 NV = ANS。 以下のための(int型 J = N- 1 ; j>は=0 ; j-- ) { もし!(VIS [J] && NV> = [J]) { NV - = [j]を。 VIS [J] = 1 。 } } } のために(int型私= 0 ; iがn <;私は++ ) の場合は(!VIS [i])と 返す 偽。 返す 真; } BOOL JUDGE2(INT ANS)// 310ms { 多重集合 <int型 > S; マルチセット < 整数 > ::イテレータit。 以下のために(int型 i = 0 ; iがn <; iは++ )S.insert([I])。 以下のために(int型 i = 0 ; iはK <; iは++ ) { int型 NV = ANS。 一方、(!S.empty()&&(それはS.upper_bound(NV)を=)=!S.begin()) { それ - 。 NV - = * それ。 S.erase(それ)。 } } を返す)(S.emptyします。 } INT メイン() { IOS :: sync_with_stdio(0)。cin.tie(0)。cout.tie(0 )。 INT T、カセ= 0 。 用(; T-- CIN >> T ;) { CIN >> N >> K。 int型の合計= 0、MV = 0 ; 以下のために(int型 i = 0 ; iがn <; iは++ ) { CIN >> [I]。 和 + = A [i]は、 MV = MAX(MV、[I])。 } ため(INT ANS = MAX(MV、(INT)CEIL(合計/ K)); ANS; ANS ++ ) { 場合(JUDGE2(ANS)) { COUT << " ケース#" << ++加瀬<< " :" < <ANS << てendl; 破ります; } } } 戻り 0 。 }
J:
問題の意味:I-スキル、j番目ステージCIJに段j-1からの各アップグレードはj番目(jは少なくとも1つの段階で、他のステージは、以上のJであってもよい)DJフィードブロックを達成するために費やさなければならない、そして、すべてのスキルもよいですお金(CIJとDJは否定することができます)、あなたがアップ稼ぐどのくらい尋ねます。
ソリューション:メンテナンスとアップグレードのコスト行列の番目のテーブル接頭辞は、列挙型は、テーブルの構成が最適な状況を模索し、0を取るときの注意のレベルは、0から始まるレベルに達することも達することができます。複雑:N * mの*の関数logm + N * M、960ms
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型 MAXN = 1E3 + 5 。 INTのN、M。 LL [MAXN]、[MAXN] [MAXN]、ST [MAXN] [MAXN] [B 20 ]。 ボイドmake_st() { ため(int型 I = 1を iが++; iが<= N ) のために(INT J = 1 ; J <= M + 1、J ++ ) ST [i] [j]は[ 0 ] = [I] [ J]; 用(int型のk = 1; K <= N。K ++ ) のための(int型 J = 1 ;(1 << J)<= Mであり、j ++ ) のための(INT I = 0、I +(1 << J) - 1 <= M; iは++ ) ST [K] [I] [J] =分(ST [K] [I]、[J- 1 ]、ST [K] [I +(1 << J- 1)] [J- 1 ])。 } 尋ねる11(int型 I、int型の L、int型R) { int型 K = LOG2(R-L + 1 )。 リターン分(ST [I] [L] [K]、ST [i]は[R-(1 << K)+ 1 ] [K])。 } int型のmain() { IOS :: sync_with_stdio(0)。cin.tie(0)。cout.tie(0 )。 INT T、カセ= 0 。 用(CIN >> T; T-- ;) { CIN >> N >> M。 以下のために(int型 i = 1 ; iは= <N; I ++ ) のための(INT J = 1 ; J <= Mであり、j ++ ) { CIN >>[I] [J]。 [i] [j]は [I] [j]を= + [I]、[J- 1 ]。 } のために(int型 I = 1 ; I <= M; iは++ ) { CIN >> B [i]は、 B [i]は = bの[I] + B [I- 1 ]。 } make_st()。 LL ANS = 0 。 以下のために(int型 i = 0 ; I <= M; iは++ ) { LL S1 = 0 。 以下のための(int型 J = 1; J <= N。J ++ ) 、S1 = S1 + J、I、M(尋ねます)。 用(INT J = 1 ; J <= nであり、j ++ ) { LL S2 = S1-尋ねる(J、I、M)+ [J] [I]; ANS = MAX(ANS、[I] B - S2)。 } } のprintf(" ケース#1%のD:%LLDする\ n "、++ 加瀬、ANS)。 } 戻り 0 。 }