代码简单但是考验洞察力的一道题

luogu 2285 打鼹鼠

S1

看到这道题的时候其实我是懵逼的。
第一眼感觉是大模拟或者搜。脑海里立马出现了一个n*n的矩阵,然后一个机器人在那走来走去打鼹鼠,如果我一直这么想下去的话估计很难出正解。

S2

看到refun的题解
这个题其实和矩阵毛关系都没有,而实质是一个最长上升子序列一类的问题,如果j点能够到达i点,那么直接f[i]=max(f[i],f[j]+1);即可。
实现的时候出现了点问题,都忘了LIS怎么打了……没有将f[i]都初始化为1,GG。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib> 
#define rint register int
#define inv inline void
using namespace std;
int n,m,t[10001],x[10001],y[10001],f[10001];
int main()
{
	scanf("%d%d",&n,&m);
	for (rint i=1;i<=m;i++)
		scanf("%d%d%d",&t[i],&x[i],&y[i]);
	f[1]=1;int ans=1;
	for (rint i=2;i<=m;i++)
	{
		f[i]=1;
		for (rint j=1;j<=i-1;j++)
			if (abs(x[i]-x[j])+abs(y[i]-y[j])<=t[i]-t[j])
				f[i]=max(f[i],f[j]+1);
		ans=max(ans,f[i]);
	}
	printf("%d",ans);
} 

总结

  1. 还是那句话,开拓思维。在oi中思维是最重要的,不要被惯性思维锁死,多想想。
  2. 题目中给的不一定是有用的,以解决问题为最终目的。
  3. 时刻回顾之前学过的东西,不要遗忘细节。
赞 赏
蒟蒻的邮箱:xmzl200201@126.com