我們發現:
交換左右相鄰的攤點,只會改變某兩列的數量,同理,交換上下相鄰的攤點有改變某兩行的數量
於是我們就可以將行和列分開考慮
而對於行和列:就是經典的均分紙牌問題,不過這裡是環形均分紙牌
必然有一種最優解:有相鄰兩個位置不發生交換
假設有\(t\)張牌,\(n\)個人,
令 \(a[i] = \frac\),\(s[i]\)為字首和
從第\(k\)個人把環斷開,\(s[i]\) 的變化是都減掉 \(s[k]\)
所以答案即為:$$\sum_^\mid s[i] - s[k] \mid$$
這就是貨倉選址問題,把\(s\)排序,取中位數即為\(s[k]\)的最優解
#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int maxn = 100010;
int n, m, t;
int x[maxn] ,y[maxn], sum[maxn];
ll read() while(ch>='0' && ch<='9') return s*f; }
int main()
int flagx = 0, flagy = 0;ll ansx = 0, ansy = 0;
// 行
if(t % n != 0) flagx = 1;
if(!flagx)
memset(sum, 0, sizeof(sum));
// 列
if(t % m != 0) flagy = 1;
if(!flagy)
if(flagx && flagy) printf("impossible\n");
else if(!flagx && flagy)else if(flagx && !flagy)else
return 0;
}
七夕祭 模擬
有乙個會場由 n role presentation style position relative nn排 m role presentation style position relative m m列共計n m role presentation style position relative...
七夕祭(貪心 中位數)
傳送門 因為交換同一列的相鄰兩行,這一列的總數不變 交換同一行的相鄰兩列,這一行的總數不變。那麼如果可以平均分配的話,可以先將所有行都分配好,然後再將所有列分配好。這樣就變成了做兩次環形紙牌分配問題,給乙個數列,最後一位和第一位相鄰,問能否平均分配,最少需要傳遞多少次。首先考慮普通紙牌均分問題 有 ...
基本演算法 七夕祭
第一行包含三個整數n和m和t。t表示cl對多少個攤點感興趣。接下來t行,每行兩個整數x,y,表示cl對處在第x行第y列的攤點感興趣。首先輸出乙個字串。如果能滿足 vani 的全部兩個要求,輸出 both 如果通過調整 只能使得各行中 cl 感興趣的攤點數一樣多,輸出 row 如果只能使各列中 cl ...