1. 程式人生 > >【題解】Luogu p2285 BZOJ1207 [HNOI2004]打鼴鼠

【題解】Luogu p2285 BZOJ1207 [HNOI2004]打鼴鼠

tumx algo uid 數據 ack LG 輸入輸出格式 owin time

題目描述

鼴鼠是一種很喜歡挖洞的動物,但每過一定的時間,它還是喜歡把頭探出到地面上來透透氣的。根據這個特點阿牛編寫了一個打鼴鼠的遊戲:在一個n*n的網格中,在某些時刻鼴鼠會在某一個網格探出頭來透透氣。你可以控制一個機器人來打鼴鼠,如果i時刻鼴鼠在某個網格中出現,而機器人也處於同一網格的話,那麽這個鼴鼠就會被機器人打死。而機器人每一時刻只能夠移動一格或停留在原地不動。機器人的移動是指從當前所處的網格移向相鄰的網格,即從坐標為(i,j)的網格移向(i-1, j),(i+1, j),(i,j-1),(i,j+1)四個網格,機器人不能走出整個n*n的網格。遊戲開始時,你可以自由選定機器人的初始位置。

現在知道在一段時間內,鼴鼠出現的時間和地點,請編寫一個程序使機器人在這一段時間內打死盡可能多的鼴鼠。

輸入輸出格式

輸入格式:

從文件input.txt中讀入數據,文件第一行為n(n<=1000), m(m<=10000),其中m表示在這一段時間內出現的鼴鼠的個數,接下來的m行中每行有三個數據time,x,y表示有一只鼴鼠在遊戲開始後time個時刻,在第x行第y個網格裏出現了一只鼴鼠。Time按遞增的順序給出。註意同一時刻可能出現多只鼴鼠,但同一時刻同一地點只可能出現一只鼴鼠。

輸出格式:

輸出文件output.txt中僅包含一個正整數,表示被打死鼴鼠的最大數目。

輸入輸出樣例

輸入樣例#1: 復制

2 2             
1 1 1        
2 2 2

輸出樣例#1: 復制

1

思路

機器人要打到鼴鼠要滿足條件
$$time[i]-time[j]>abs(x[i]-x[j])+abs(y[i]-y[j])$$
即鼴鼠出現的時間間隔要大於機器人移動所需時間

代碼

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7
#define re register int 8 using namespace std; 9 inline int read(){ 10 int x=0,w=1; 11 char ch=getchar(); 12 while(ch!=-&&(ch<0||ch>9)) ch=getchar(); 13 if(ch==-) w=-1,ch=getchar(); 14 while(ch>=0&&ch<=9) x=(x<<1)+(x<<3)+ch-48,ch=getchar(); 15 return x*w; 16 } 17 int N,M,f[10010],ans=0; 18 struct data { 19 int x,y,t; 20 }d[10010]; 21 22 inline int dis(int i,int j) { 23 return abs(d[i].x-d[j].x)+abs(d[i].y-d[j].y); 24 } 25 int main() { 26 N=read(),M=read(); 27 re i; 28 for(i=1;i<=M;++i) {d[i].t=read();d[i].x=read();d[i].y=read();} 29 for(i=1;i<=M;++i) f[i]=1; 30 for(i=1;i<=M;++i) { 31 for(re j=1;j<i;++j) 32 if(f[j]>=0&&d[i].t-d[j].t>=dis(i,j)) 33 f[i]=max(f[i],f[j]+1); 34 ans=max(ans,f[i]); 35 } 36 printf("%d\n",ans); 37 return 0; 38 }

?

【題解】Luogu p2285 BZOJ1207 [HNOI2004]打鼴鼠