題解 LuoGu3694 邦邦的大合唱站隊

2021-09-29 15:35:14 字數 2078 閱讀 8964

原題傳送門

暗示明顯,狀壓dpdp

dp狀態設計簡單,當前有多少樂隊已經排好隊為1,其餘為0,壓成二進位制iiid

pi

dp_i

dpi​

表示狀態i

ii的答案

本來還一直在想如何來是最優策略,突然靈機一動

我這不是dpdp

dp嘛,那我萬一既然有了最優策略,我還d

dd什麼呢

現在,只有最終狀態下樂隊的相對位置會影響答案大小

d pdp

dp的時候按照列舉樂隊順序從左到右放置樂隊

令s um

i,

jsum_

sumi,j

​表示1~j個人中有幾個是第i的樂隊的

d pj

∣(

1<

<—dp

j+(r

−l+1

)−(s

umi,

r−su

mi,l

−1

)dp_{j|(1j∣(1

<

​<—dp

j​+(

r−l+

1)−(

sumi

,r​−

sumi

,l−1

​)其中l−1

=∑i=

1msu

mi,n

((11=i=

1∑m​

sumi

,n​(

(1<)

code:

//我也不知道我是腦抽了還是怎麼了,心血來潮寫個pascal

uses math;

var n, m, x, l, r, i, j : longint;

power : array[

0..25

] of longint;

sum : array[

0..21,0.

.2000010

] of longint;

dp : array[

0..2000010

] of longint;

begin

readln

(n, m)

;for i :

=1 to n do

begin

readln

(x);

for j :

=1 to m do

sum[j]

[i]:

= sum[j]

[i -1]

;inc

(sum[x]

[i])

; end;

power[0]

:=1;

for i :

=1 to 20

do power[i]

:= power[i -1]

<<1;

for i :

=1 to power[m]-1

do dp[i]

:= maxlongint div 2

;for i :

=0 to power[m]-1

do begin

l :=0

;for j :

=1 to m do

if(i and power[j -1]

<

>

0) then inc

(l, sum[j]

[n])

;for j :

=1 to m do

if(i and power[j -1]

=0) then

dp[i or power[j -1]

]:=min

(dp[i or power[j -1]

], dp[i]

+ sum[j]

[n]- sum[j]

[l + sum[j]

[n]]

+ sum[j]

[l])

; end;

writeln

(dp[power[m]-1

]);end.

Luogu P3694 邦邦的大合唱戰隊

題目傳送門 n 個人,分別屬於 m 個組,要求同組的人站在一起。每個人可以出隊,出隊後留出空位,出隊後的人可以在任意空位歸隊。求最少出隊人數。看到 m 的資料範圍極小,猜測可能是狀壓dp。但沒有想出來到底是如何狀壓,於是重新審視題意。可以發現,最後同組的人站在一起,一定會形成組的順序,例如 1111...

Luogu P3694 邦邦的大合唱站隊

link n 個偶像排成一列,他們來自 m 個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位置任意。請問最少讓多少偶像出列?1 le le10 5,m l...

P3694 邦邦的大合唱站隊

bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...