SCOI2014 方伯伯的商場之旅

2022-02-06 02:16:45 字數 1949 閱讀 7770

方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。

現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r。方伯伯要把位置在 [l, r] 中的每個人的石子都合併成一堆石子。每次操作,他可以選擇乙個人面前的兩堆石子,將其中的一堆中的某些石子移動到另一堆,代價是移動的石子數量 * 移動的距離。商場承諾,方伯伯只要完成任務,就給他一些椰子,代價越小,給他的椰子越多。所以方伯伯很著急,想請你告訴他最少的代價是多少。

例如:10 進製下的位置在 12312 的人,合併石子的最少代價為:

1 * 2 + 2 * 1 + 3 * 0 + 1 * 1 + 2 * 2 = 9

即把所有的石子都合併在第三堆

輸入僅有 1 行,包含 3 個用空格分隔的整數 l,r,k,表示商場給方伯伯的 2 個整數,以及進製數

1 < =  l < =  r < =  10^15, 2 < =  k < =  20

說白了,這個題就是給了l~r的數,每個數的每個數字是一堆石子,把這堆石子合成乙個位置,求總的最小代價。

發現,對於乙個數字p,假設欽定最終合併位置是p,

調整的時候,p向左移動一位,代價變化是p及右邊所有的數字和-p左邊所有數字和。

p向右移動一位,代價變化是p及左邊所有數字和-p右邊所有數字和。

設最優的位置的數字是x,位置是p,p左邊數字和是a,右邊是b

那麼,一定有不等式:x+a-b>=0 ; x+b-a>=0 就是說,x不論往左往右移動,代價的變化總是增大的。

即:-x<=a-b<=x

所以,如果知道最終填的a-b,和x,p,就可以判斷這個p位置填x是不是左邊a,右邊b的最優解了。

列舉p,x;

偽**:(cnt是最高位,進製用m,填數用k)

for(p=1~cnt)

for(x=0~m-1)

for(i=cnt~1)

for(a-b=-200~+200)

設f[i][a-b][0/1]表示,填完第i位,a-b的值,有沒有限制情況下,所有符合情況的數移動到p位置所花費的代價。

g[i][a-b][0/1]表示,f的方案數,即滿足情況的數的個數,方便轉移。

if(i==p)

else

if(x==a[i])

else

continue

; }

for(int k=0;k)

else

if(k==a[i])

else

}else

else

if(k==a[i])

else}}

}}

for(int j=0;j<=up;j++)}}

}

return

ret;

}int

main()

if(cnt==0

)

else

cnt=0

;

while

(r) ansr=wrk();

printf(

"%lld

",ansr-ansl);

}直接欽定1號位置是最優位置,計算出來所有的總和ans

調整。列舉位置p從2~cnt,表示要計算從p-1移動到p,會有多少個數的代價減少多少。

代價就是,sum(1,p-1)-sum(p,cnt)

設f[i][a-b][0/1]表示,第i位,這個sum的差值,有沒有限制情況下,多少個數符合這個情況。

迴圈完乙個p之後,

把a-b<0的f,ans-=(a-b)*f[i][a-b][0/1]

a-b>=0的不管。

這樣進行cnt次,一定可以把所有的數移動到最優解的位置。

網上題解很多,**就不貼了。(我也沒寫)

SCOI2014 方伯伯的商場之旅

題目描述 方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r 方伯伯要把位置在 l,r 中的每個人的石子都合...

方伯伯的商場之旅 SCOI2014

方伯伯有一天去參加乙個商場舉辦的遊戲。商場派了一些工作人員排成一行。每個人面前有幾堆石子。說來也巧,位置在 i 的人面前的第 j 堆的石子的數量,剛好是 i 寫成 k 進製後的第 j 位。現在方伯伯要玩乙個遊戲,商場會給方伯伯兩個整數 l,r 方伯伯要把位置在 l,r 中的每個人的石子都合併成一堆石...

SCOI2014 方伯伯的商場之旅 解題報告

我一開始的想法會被兩個相同的集合位置去重給搞死,不過應該還是可以寫的,討論起來老麻煩。可以先欽定在 1 號點集合,然後往後調整一部分。具體一點,通過字首和減去字尾和的正負性移動 寫的時候把 sum 壓進去搞會非常簡單 code include include define ll long long ...