トピック:のhttp://codeforces.com/problemset/problem/227/D
質問の意味:N石の数がヒープ、石の各ヒープが有するI石の山に結合されたすべての石のこのパイルの各合成コスト、(石の山石の別の山に移動しようとしている)を組み合わせることにより、数、K I制限下には、それぞれを積み上げ石を組み合わせることが可能で k回、最終的な総組み合わせ最小コストを見つけるために、別のスタックに、K番目のスタック後に石を移動させる必要があります。
問題の解決方法:emmmmm、それは、最小コストを見つけるために、その後、石の石杭の最大数は確かに動いていない、石のこの山を移動するには、いくつかのk倍の石の小さな山を置くので、これは石のk個のヒープを動かしているので、それらのそれぞれに石のこのk個の山は、このk個の* kのヒープが二回移動、というようにすることを、自分の体に組み込まれた石のk個のヒープよりも小さくなっています。
1 k倍
K * K 2倍
K * K * K 3回
K * K * K * K 4回
。
。
。
。
すなわち、そうK * 1 * + K ^ 2 * 2 *数+ K ^ 3 * 3 *数の最小数の合計コスト.....
もちろん、kは必要公報文である、最小ヒープは、n-1移動時間を、第二の最小移動スタックN-2倍、最大スタックは、特定のコードを見て、移動しません。
データのほとんどは、長い長い範囲であることに注意してください。
1つの#include <地図> 2の#include <積層> 3の#include <キュー> 4の#include <cmath> 5の#include < ストリング > 6の#include <限界> 7の#include <cstdioを> 8の#include <ベクトル> 9# <cstdlib>含む 10の#include <CStringの> 11の#include <iostreamの> 12の#include <アルゴリズム> 13 の#define Sccを(C)のscanf( "%のC"、&C) 14 の#define Scsを(S)のscanf( "%sの」、S) 15 の#defineサイエンス(X)のscanf( "%dの"、 &X) 16 の#defineSCI2(X、Y)のscanf( "%dの%のD"、およびX&Y) 17 の#define SCI3(X、Y、Z)のscanf( "%D%D%D"、およびX&Y、およびZ) 18 の#define SCL(X)のscanf( "%I64d"、&x)は 19 の#define SCL2(X、Y)のscanf( "%I64d%I64d"、およびX&Y) 20 の#define SCL3(X、Y、Z)のscanf( "% I64d%I64d%I64d」、およびX&Y、およびZ) 21 の#defineのPri(X)のprintf( "%d個の\ n"、x)は 22 の#define PRL(X)のprintf( "%I64dの\ n"、x)は 23 #define Prcを(C)のprintf( "%のCする\ n"、C) 24件 の#define PRS(複数可)のprintf( "%Sの\ n"、S) 25 の#defineための式(I、x、y)のための(INT iが= X; I yを<。 I ++) 26 の#define For_(I、x、y)がため(I = xをint型、iは= yと<; iは++します) 27 の#defineのための(I、x、y)はFFor(; I> Y; I = xをint型i--) 28 の#define FFor_(I、x、y)は(I = xをint型のために、I> = Y; iが- ) 29 の#define MEM(F、X)のmemset(F、X、はsizeof(F)) 30 の#define LL長い長い 31 の#define ULLのunsigned long長い 32 の#define MAXSIZE 100005 33 の#define INF 0x3f3f3f3f 34 のconst int型 MOD = 1E9 + 7 。 35 CONST ダブル PI = ACOS( - 1.0 )。 36 37 使って 名前空間STDを、 38 INTCMP(LL、LLのB) 39 { 40 リターン < B。 41 } 42 のint main()の 43 { 44 45 LLをN。 46 SCL(N) 47は int型のI; 48 LL [MAXSIZE] = { 0 }。 49 のために(i = 1 ; iが<= N iが++ ) 50 SCL([I])。 51 ソート(+ 1、A + 1個の + N)。 52 LLのTMP = 0 。 53 For_(I、1、N-1)// ループのこれら二つの順序なお、 54は TMP = A + [I] *(N- I); 55 For_(I、1 、N-) 56である [I] = A + [I- 1 ]。// *同じである、すなわち、([M] -a [MK])毎にスタック石を組み合わせたXのk倍の電力を計算するために使用されるCNT、 57である INT Q; 58 サイエンス(Q); 59 ながら( - Q ) 60 { 61は、 LL ANS = 0 ; 62であり 、LL K 63であり 、SCL(K) 64 INT T = K; 65 LL = CNT 1、M = N- 1。; 66 IF(= K!1。 ) 67 { 68 ながら(M> = K)// kがnに等しいより大きい場合、実行されず、直接実行ANS + = CNT * [M ];、 すなわち、最小のコストがフロントN-あります1つのスタックと石の数、すなわちA * 1 [m]の 69 { 70の ANS + =([m]は-a [MK])* CNT; 71である ++ CNT ; 72 M- = K; 73である K = K * T。// 変更kはKK ^ 2のk ^ 3のk ^ある 4 ... 初期kのサイズを掛けたびに、初めは書かK * = K、WA 1日の午後、私はあまりにもハードQAQた 74 } 75 ANS + = * CNT A [M]; 76 } 77 他 78 = ANS TMP; 79 のprintf(" %I64d "、ANS); // 出力も、この謎。 80 } 81 リターン 0 ; 82 }
ああ、問題ありませんでした、彼は本当に、一日かかりました。。。。。。多くの場所ではうまく働いています。ああ。