有乙個會場由
n' role="presentation" style="position: relative">nn排
m' role="presentation" style="position: relative">m
m列共計n×
m' role="presentation" style="position: relative">n×m
n×m個攤點組成。但是小
l' role="presentation" style="position: relative">l
l只對其中的一部分攤點感興趣。他預先聯絡了會場的負責人,希望能夠通過恰當地布置會場,使得各行中他感興趣的攤點數一樣多,並且各列中他感興趣的攤點數也一樣多。
但是攤點已經隨意布置完畢了,如果想滿足小
l' role="presentation" style="position: relative">l
l的要求,唯一的調整方式就是交換兩個相鄰的攤點。兩個攤點相鄰,當且僅當他們處在同一行或者同一列的相鄰位置上,每一行或每一列的第乙個位置和最後乙個位置也算作相鄰。現在小
l' role="presentation" style="position: relative">l
l想知道他的兩個要求最多能滿足多少個。在此前提下,至少需要交換多少次攤點。 in
put' role="presentation" style="position: relative">inp
utinput
2 3 4
1 32 1
2 22 3
ou
tput
' role="presentation" style="position: relative">out
puto
utpu
t
row 1
如果這道題只有一行,且一行的最後和第一不相連的話,就很容易想到 均分紙牌 。所以說,這道題其實就是均分紙牌的高階版。
但是這道題並不能貪心。畢竟o(
n2)' role="presentation" style="position: relative">o(n
2)o(
n2)還是吃不消的。
如果使用均分紙牌的方法,那麼就列舉從第
k' role="presentation" style="position: relative">k
k個位置開始,像均分紙牌的方法一樣依次向後推。最後取最小值。預計得分 70 分。
#include
using
namespace
std;
int n,a[101],mid,sum,x;
int main()
mid/=n; //算平均值
for (int i=1;i<=n;i++)
}printf("%d\n",sum);
return
0;}
其實洛谷上還有另外一道題很像這道題。糖果傳遞,跟這道題就真的很像了。
可以利用字首和的思想,求出每一行的感興趣攤點的個數,將這些字首和排序,再求出中位數,按照|s
1−sk
|+|s
2−sk
|+|s
3−sk
|+……
+|sn
−sk|
' role="presentation" style="position: relative">|s1
−sk|
+|s2
−sk|
+|s3
−sk|
+……+
|sn−
sk||
s1−s
k|+|
s2−s
k|+|
s3−s
k|+…
…+|s
n−sk
|公式求出答案即可。
那麼為什麼選擇中位數就一定對呢?
我們把這個問題看成一條路上有
m' role="presentation" style="position: relative">m
m戶人家,要在這條路上打一口井,問選擇**打井可以使所有人家到達井的總路程最小?
不難發現,水井有無限個位置可以放,但是肯定是放
2' role="presentation" style="position: relative">2
2號人加到
4' role="presentation" style="position: relative">4
4號人家之間最優。那麼在那個點是在最優中最優呢?
無論水井放在
2' role="presentation" style="position: relative">2
2號人家和
4' role="presentation" style="position: relative">4
4號人家之間的那個點,除
3' role="presentation" style="position: relative">3
3號人家外的所有點到達水井的距離都是不變的。那麼問題就轉化成了:水井放在**距離3號人家最近?
那這個問題就很明顯了:放在
3' role="presentation" style="position: relative">3
3號人家的門口肯定離
3' role="presentation" style="position: relative">3
3號人家最近嘛!
所以說,無論有3,
5,7...2x+
1' role="presentation" style="position: relative">3,5
,7...2x+
13,5
,7...2x+
1個人家,只要放在最中間(中位數)的人家就一定滿足最優。
那麼當人家為偶數個呢?
那麼,只要水井放在中間兩戶人家(
3' role="presentation" style="position: relative">3
3號人家和
4' role="presentation" style="position: relative">4
4號人家)之間,答案都最優。
所以,如果這道題選擇中位數,那麼一定能保證答案最優。
**:
#include
#include
#include
using
namespace
std;
long
long h[100001],l[100001],x,y,n,m,k,sum,s1[100001],s2[100001],z1,z2;
void h() //計算行
void l() //計算列
int main()
if ((!(k%n))&&(!(k%m))) //both情況
else
if (!(k%n)) //row情況
else
if (!(k%m)) //column情況
else
return
printf("impossible")&0;
return
printf("%lld\n",sum)&0;
}
NOIP2013模擬 七夕祭
description 七夕節因牛郎織女的傳說而被扣上了 情人節 的帽子。於是tyvj今年舉辦了一次線下七夕祭。vani同學今年成功邀請到了cl同學陪他來共度七夕,於是他們決定去tyvj七夕祭遊玩。tyvj七夕祭和11區的夏祭的形式很像。矩形的祭典會場由n排m列共計n m個攤點組成。雖然攤點種類繁多...
NOIP2013模擬 七夕祭
第一行包含三個整數n和m和t。t表示cl對多少個攤點感興趣。接下來t行,每行兩個整數x,y,表示cl對處在第x行第y列的攤點感興趣。首先輸出乙個字串。如果能滿足vani的全部兩個要求,輸出both 如果通過調整只能使得各行中cl感興趣的攤點數一樣多,輸出row 如果只能使各列中cl感興趣的攤點數一樣...
NOIP2013模擬 七夕祭
題目描述輸入 第一行包含三個整數n和m和t。t表示cl對多少個攤點感興趣。接下來t行,每行兩個整數x,y,表示cl對處在第x行第y列的攤點感興趣。輸出 首先輸出乙個字串。如果能滿足vani的全部兩個要求,輸出both 如果通過調整只能使得各行中cl感興趣的攤點數一樣多,輸出row 如果只能使各列中c...