[HNOI2004]打鼹鼠

题目大意:
  有一个$n\times n$的格子,按顺序出现$m(m\leq10000)$只鼹鼠。一开始你可以任选一个位置作为一个起点,每秒钟你可以选择原地不动或走到任一与当前位置四连通的格子上。第$t_i$秒会在$(x_i,y_i)$上出现一个鼹鼠,若你当时刚好在这个格子上,就算作成功打到了这个鼹鼠。问最多能打到几个鼹鼠?

思路:
  用$f[i]$表示前$i$个鼹鼠中最多能打到几个。转移时判断一下曼哈顿距离是否小于等于时间差即可。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<algorithm>
 4 inline int getint() {
 5     register char ch;
 6     while(!isdigit(ch=getchar()));
 7     register int x=ch^'0';
 8     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
 9     return x;
10 }
11 const int M=10000;
12 int t[M],x[M],y[M],f[M];
13 int main() {
14     const int n=getint(),m=getint();
15     int ans=0;
16     for(register int i=0;i<m;i++) {
17         t[i]=getint(),x[i]=getint(),y[i]=getint(),f[i]=1;
18         for(register int j=0;j<i;j++) {
19             if(std::abs(x[i]-x[j])+std::abs(y[i]-y[j])<=t[i]-t[j]) {
20                 f[i]=std::max(f[i],f[j]+1);
21             }
22         }
23         ans=std::max(ans,f[i]);
24     }
25     printf("%d\n",ans);
26     return 0;
27 }

 

posted @ 2018-02-19 20:12  skylee03  阅读(129)  评论(0编辑  收藏  举报