維和部隊題解

2021-10-07 06:22:18 字數 2277 閱讀 1717

題目描述

在2019國慶大閱兵儀式上,藍色貝雷帽,荒漠迷彩服,維和部隊方隊闊步走來。中國是聯合國安理會常任理事國中派出維和人員最多的國家。在聯合國7個維和任務區,2500多名中**人守護在最危險的地方,還有8000名維和待命官兵隨時聽令出征。中國無戰事,軍人有犧牲。先後有13名維和勇士犧牲在異國他鄉,中**人用生命和熱血彰顯維護世界和平的大國擔當!向維和部隊官兵致敬!向中**人致敬!

現在,維和部隊每天都收到很多的維和任務命令,假設維和部隊所在的維和區域可以抽象為乙個n*n大小的矩陣形區域,並且認為矩陣形區域的左上角座標為<1,1>,右下角座標為。現在聯合**事指揮所開始陸續地在我維和區域下達維和任務的命令,命令格式如下(詳見資料樣例):

time row col

該命令格式解讀為:在time時刻,在矩陣形區域的座標處有乙個維和任務,如果要完成該任務,部隊必須在time時刻到達這裡,也就是說,如果維和部隊到達的時刻不是time,則認為這個任務失敗。現在維和部隊正乘坐武裝***在維和區域上空待命,他們隨時準備空降到矩形區域的任何乙個點上,假設空降到地面的時刻為1時刻,落地之後每過乙個時間單位,他們只能向直接相鄰的上、下、左、右四個方向移動乙個距離單位,或者保持在原地不動。維和區域情況非常複雜,每乙個維和任務確實不一定能夠完成,現在你作為我維和部隊的參謀長,請你根據維和任務資料和規則,計算在給定的任務中做多能夠完成幾個?

輸入格式

第一行輸入兩個正整數n, m,空格分隔,分別代表矩形區域的大小和維和任務數量,1<=n<=1000,1<=m<=10000

接下來m行每行三個數,空格分隔,代表在時刻time,矩形區域的橫座標row,縱座標col處有乙個任務。

資料保證任何兩個任務都是不同的,同一時刻最多只有乙個任務命令。

輸出格式

輸出維和部隊最多能夠完成的任務數量。輸出資料完成後輸出回車換行。

輸入樣例 複製

7 73 6 3

4 4 7

5 7 3

1 5 3

2 3 5

7 1 3

6 2 3

輸出樣例 複製

3解題思路:

這題的19包師校賽題最開始看見這個題的時候 以為是要建乙個二維陣列 然後搜尋… 盡力了 沒搞出來 看著以前的校賽題解 不對勁啊 這不是乙個搜尋呀 這是乙個貪心問題吧 做盡可能多的任務嘛 是動態規劃 又現從網上學的lis 上圖!

就像題解中說的這是個動態規劃問題,lis變形題,按時間排序,時間差允許範圍內去多做 乙個任務。 在**裡有詳細的注釋

以下是ac**:

#include

#include

#include

#include

using

namespace std;

//這個題 最開始理解錯題意了 這裡的 time 可不是在什麼時間要完成什麼 而是說 完成當前任務後 在到下乙個任務點所限定的時間

struct gridg[

1005];

//這個陣列 是我們一會要用lis(最大上公升子串行)需要的

int dp[

1005];

bool

cmp(grid a , grid b)

intmain()

//為什麼要sort排序呢 因為 我們想要做的是在時間差允許的範圍內做盡可能多的任務!

//貪心! 這次的sort都加了1 是因為我在輸入的時候就是從i=1開始輸入的 半閉半開區間嘛

sort

(g+1

,g+m+

1,cmp)

;//這個變數是來存最多能完成多少任務的 只要存個負數 或者 0 都行 因為極端情況就是沒有任務唄 其實0就足夠了

int ans =-1

;//其實這兩個迴圈就是 lis 的寫法 只不過就是多加了判斷

//在這道題目中其實他已經變相跟你說了 沒有別的坑了 我從天上往地下飛 也得需要1個time呢! 所以最開始不要多想

for(i=

1; i<=m; i++

)//因為lis演算法可不是dp[最大下標]就最大 如0 1 2 5 0 最大子串行長度是4 dp[3]==4 dp[4]==1

ans =

max(ans,dp[i]);

} cout<

}return0;

}