51node 1487 占領資源 思維 暴力列舉

2021-07-25 03:05:38 字數 1603 閱讀 9102

1487 占領資源

topcoder

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

有乙個矩形區域被劃分為n行m列的網格,每個格仔裡有一定數量的資源並記錄在矩陣val中,座標(x,y)位置上資源量為val[x][y],其val中每個元素的值為0~9的整數。如果你在某個網格(a,b)上造一座保護塔,那麼你可以占領k個網格中的資源,這k個格仔分別是(a+dx[1],b+dy[1]),(a+dx[2],b+dy[2]),...,(a+dx[k],b+dy[k]),注意(a,b)這格本身可能未必會被占領。現在你能建造不超過2個塔,問最多能占領多少資源?乙個網格被多個塔占領時其資源只計算一次。另外如果計算的位置(a+dx[i],b+dy[i])在網格外,則不貢獻任何資源。

input

多組測試資料,第一行乙個整數t,表示測試資料數量,1<=t<=5

每組測試資料有相同的結構構成:

每組資料第一行三個整數n,m,k,其中2<=n,m<=100,1<=k<=10。

之後會有n行,每行m個元素,表示val矩陣。每個元素為0~9,佔乙個字元,元素間沒空格。

再接下來有k行,每行兩個整數dx[i]與dy[i],其中-(n-1)<=dx[i]<=n-1,-(m-1)<=dy[i]<=(m-1).

output

每組資料一行輸出,即可占領的最大資源總量。
input示例

3

2 2 2

1111

0 00 1

2 2 2

1111

0 01 1

2 2 1

1561

0 0

output示例

4

311

思路:1、首先我們讀完題之後肯定第一反應就是暴力列舉兩個點,統計其價值和之後,維護最大,然而其時間複雜度很高,會達到o(n^4*k)【假設n==m】;顯然會超時,那麼考慮進行優化。

2、我們如果極限去想,不難想到這樣乙個思路:

我們o(nm)列舉乙個點,將其值進行維護,維護出最大價值點,進行記錄。然後再o(nm)的列舉另外乙個點,同時對這個點進行值的記錄,最後統計兩個點的和,維護最大。

顯然這種思路是有紕漏的,因為如果是次大值的點和第三大的點的和比上述維護的最終最大值大,那麼這個思路就尷尬了。

我們不單單維護最大值的點,而是維護較多點,進行統計即可。我們可以腦補一下,反正維護100個點就肯定夠了,那麼對應我們開乙個優先佇列,將每乙個點的價值都統計出來之後,放入佇列中,每次取隊頭,然後o(nm)列舉第二個點,對兩個點的總價值進行統計,並且維護最終的最大即可。

然後經過測試,後台資料維護3個點就夠了。。(然而我不會證明。反正思路大方向對了能ac就好啦)

ac**:

#include#include#includeusing namespace std;

struct node

{ int sum;

int x,y;

friend bool operator <(node a,node b)

{return a.sums;

for(int i=0;i=0&&xx=0&&yy=0&&xx=0&&yy=0&&xx=0&&yy

51node 1459 迷宮遊戲

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...

51node 1522 上下序列

現在有1到n的整數,每一種有兩個。要求把他們排在一排,排成乙個2 n長度的序列,排列的要求是從左到右看,先是不降,然後是不公升。特別的,也可以只由不降序列,或者不公升序列構成。例如,下面這些序列都是合法的 1,2,2,3,4,4,3,1 1,1 2,2,1,1 1,2,3,3,2,1 除了以上的條件...

51node 1449 砝碼稱重 進製思想

原題鏈結 1449 砝碼稱重 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 現在有好多種砝碼,他們的重量是 w0 w1,w2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。樣例解釋 可以將重物和3放到乙個托盤中,9和1放到另外乙個托...