題目:
在n×nn×n
的矩形中找出乙個點,使得這個點到其他標記點曼哈頓距離加上標記點的權值之和最小。101
0分做法:n≤
10n≤1
0列舉這個矩陣的每乙個點,再列舉每乙個標記點,求出曼哈頓距離,取最小值即可。
或者從每個標記點跑bfs
bfs。
時間複雜度:o(n
4)o(
n4)10分**
30分做法:n≤
1000n≤
1000
假設這個圖是這樣子的(黃色點是標記點):
可以把第三行的所有點和第一行的特殊點的曼哈頓距離連一下看看。
會發現,它們向下的距離(藍色部分)是一樣的!
同理,下面的標記點也一樣。
所以,任何乙個特殊點到同一行的點的曼哈頓距離中經過的列數是一樣的。
同理,所有的特殊點到同一列的點的曼哈頓距離中經過的行數是一樣的。
那麼我們設h[i
]h[i
]表示所有特殊點到這一行的點曼哈頓距離經過的列數,l[i
]l[i
]表示所有特殊點到這一列的點曼哈頓距離經過的行數。
那麼我們就先初始化出每行每列的特殊點的個數,然後o(n
2)o(
n2)列舉任意兩行,求出第j
j行的特殊點到第i
i行的所有點的曼哈頓距離的列數(同理也要列舉任意兩列)
最後可以o(n
2)o(
n2)列舉所有點,蔬輸出最小的那乙個。
30分**
100100
分做法:o(
n)o(
n)考慮如何在30分的做法上優化。跳過了30分的朋友建議回去再可以下30分的做法。
我們可以發現,第i
i行的點到所有特殊點的曼哈頓距離之和是可以通過第i−1
i−1行的點得到的。如果能o(1
)o(1
)轉換,那麼就可以了。
首先,很容易發現:h[
i]=h
[i−1
]+在第
i−1行
上面的特
殊點數量
−在第i
行下面的
特殊點數
量h[i
]=h[
i−1]
+在第i
−1行上
面的特殊
點數量−
在第i行
下面的特
殊點數量
那麼如果能o(1
)o(1
)知道在任意一行上面的點的數量和下面的點的數量就可以o(1
)o(1
)轉化。
所以可以求乙個字首和,hs[
i]hs
[i]表示在第i
i行(含)之前的特殊點數量,那麼就有hs
[i]=
hs[i
−1]+
hnum
[i]h
s[i]
=hs[
i−1]
+hnu
m[i]
知道了上面的特殊點數量,那麼下面的特殊點數量就一目了然了。
那麼就可以先o(n
)o(n
)求出第一行的點到所有特殊點的曼哈頓距離,然後就可以推出每一行到特殊點的距離。
列也同理,可以o(n
)o(n
)求出。
那麼我們就做到了:
那麼就只剩下最後乙個o(n
2)o(
n2)的地方了:輸出。
我們可以o(n
)o(n
)知道所有行的最小列曼哈頓距離,又可以o(n
)o(n
)知道所有列的最小曼哈頓距離,那麼這兩行的交點就是到所有標記點曼哈頓距離最短的點!
;//字首和
for(ll i=
1;i<=n;i++
) h[1]
+=(hnum[i]
*abs
(i-1
)*z)
;for
(ll i=
1;i<=n;i++
) l[1]
+=(lnum[i]
*abs
(i-1
)*z)
;//求出第一行第一列
for(ll i=
2;i<=n;i++
) h[i]
=h[i-1]
+hs[i-1]
*z-(m-hs[i-1]
)*z;
for(ll i=
2;i<=n;i++
) l[i]
=l[i-1]
+ls[i-1]
*z-(m-ls[i-1]
)*z;
//往後轉移
minn=
1e16
;for
(ll i=
1;i<=n;i++)if
(h[i]
//找最小的行
minn=
1e16
;for
(ll i=
1;i<=n;i++)if
(l[i]
//找最小的列
cout<
+l[y]
+sum<<
"\n"
<
" "<
return0;
}
577 員工獎金
選出所有 bonus 1000 的員工的 name 及其 bonus。employee 表單 bonus 表單 輸出示例 題目條件 mysql drop table ifexists bonus create table bonus empid int 11 notnull bonus int 11...
mysql 5 7 7以後需要初始化資料庫
用zip包的形式在windows上安裝了mysql 5.7.10,在啟動服務的時候,總是提示無法啟動服務,說是服務沒有報告任何錯誤。從windows的事件管理器中可以看到錯誤資訊 fatal error can t open and lock privilege tables table mysql...
JZOJ 交換 模擬
給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...