題目描述
在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;
}