2019頭の牛とより多くの乗客第六校

  質問の意味:記号は、長い時間のために読むためにタイトルを読んで......

 

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 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/Yokel062/p/11305932.html