七夕祭(貪心 中位數)

2022-06-29 15:45:08 字數 1985 閱讀 2923

傳送門

因為交換同一列的相鄰兩行,這一列的總數不變;交換同一行的相鄰兩列,這一行的總數不變。

那麼如果可以平均分配的話,可以先將所有行都分配好,然後再將所有列分配好。

這樣就變成了做兩次環形紙牌分配問題,

給乙個數列,最後一位和第一位相鄰,問能否平均分配,最少需要傳遞多少次。

首先考慮普通紙牌均分問題:

有 \(n\) 個人坐成一排,每個人 \(a[i]\) 張牌,每個人只能和旁邊的人交換紙牌,問最好交換幾次能使所有人的手牌數相等。

這是乙個經典問題,答案等於 \(\sum_^n|s[i]-\frac\cdot i|\),其中 \(s[i]=\sum_^ia[i],t=sum[n]\)。

這個結論是很好證明的,前 \(i\) 個人現在有的牌總共為 \(s[i]\) 張,而他們最終的狀態是總共 \(\frac\cdot i\) 張,所以他們需要通過第 \(i\) 個人向第 \(i+1\) 個人給出或者索取 \(|s[i]-\frac\cdot i|\) 張牌。

環形紙牌均分問題:

剛剛是 \(n\) 個人做成一行,現在是 \(n\) 個人做成一圈,第 \(1\) 個人和第 \(n\) 個人也可以交換紙牌了,問題相同。

不管怎麼說,它總有乙個起點,乙個終點,我們現在只是不清楚怎樣選取起點終點可以使得答案更小而已,不妨先設將第 \(k+1\) 個人設為起點,第 \(k\) 個人設為終點。

設 \(a[i]=a[i]-\frac\),\(s[i]=\sum_^ia[i]\),從第 \(k\) 個人斷開看成一行。列出現在的排列和字首和:

\[\\a[k+1]\quad s[k+1]-s[k]

\\a[k+2]\quad s[k+2]-s[k]

\\ \cdot

\\a[n]\quad s[n]-s[k]

\\a[1]\quad s[1]+s[n]-s[k]

\\a[2]\quad s[2]+s[n]-s[k]

\\ \cdot

\\a[k]\quad s[k]+s[n]-s[k]

\]因為 \(s[i]=\sum_^ia[i]\),所以 \(s[n]=0\),那麼可以發現對於不同的 \(k\),答案是 \(\sum_^n|s[i]-s[k]|\),這個式子又涉及到了乙個經典問題。

貨艙選址

x 軸上有 \(n\) 個廠房,給出每個的位址 \(a[i]\),要求選乙個廠房位址建貨艙使所有廠房到這裡的路程總和最小。

答案也是很簡單的,是 \(a\) 數列的中位數,證明:設在最優位置倉庫左邊有 \(q\) 個倉庫,總距離 \(q\),右邊有 \(p\) 個倉庫,總距離 \(p\),則滿足以下關係:

\[\\q+p\le q-q*disl+p+(p+1)*disl\rightarrow p-q+1\geq 0

\\q+p\le q+(q+1)*disr+p-p*disr\rightarrow q-p+1\geq 0

\\ \downarrow

\\|p-q|\le 1

\]回到環性紙牌均分問題

\(\sum_^n|s[i]-s[k]|\) 的最小值就是 \(s[k]\) 取 \(s\) 的中位數時

#include using namespace std;

typedef long long ll;

const int maxn=1e5+10;

int n,m,t;

ll r[maxn],c[maxn];

ll calc(ll *a,int n)

int main()

if(t%n==0&&t%m==0) printf("both %lld\n",calc(r,n)+calc(c,m));

else if(t%n==0) printf("row %lld\n",calc(r,n));

else if(t%m==0) printf("column %lld\n",calc(c,m));

else printf("impossible\n");

return 0;

}

bzoj3032 數論 中位數 七夕祭

description input 第一行包含三個整數n和m和t。t表示cl對多少個攤點感興趣。接下來t行,每行兩個整數x,y,表示cl對處在第x行第y列的攤點感興趣。output 首先輸出乙個字串。如果能滿足vani的全部兩個要求,輸出both 如果通過調整只能使得各行中cl感興趣的攤點數一樣多,...

七夕祭 模擬

有乙個會場由 n role presentation style position relative nn排 m role presentation style position relative m m列共計n m role presentation style position relative...

AcWing 105 七夕祭 貪心

我們發現 交換左右相鄰的攤點,只會改變某兩列的數量,同理,交換上下相鄰的攤點有改變某兩行的數量 於是我們就可以將行和列分開考慮 而對於行和列 就是經典的均分紙牌問題,不過這裡是環形均分紙牌 必然有一種最優解 有相鄰兩個位置不發生交換 假設有 t 張牌,n 個人,令 a i frac s i 為字首和...