1 条题解

  • 0
    @ 2024-6-12 19:58:50

    本题的思路类似于LIS。设 f[i]f[i] 为到第 ii 个鼹鼠为止可以打到几个, dis(i,j)dis(i,j)i ji\ j 两点之间的曼哈顿距离,iti_tjtj_t 分别表示第 ii 个和第 jj 个鼹鼠出现的时间。j<iitjtdis(i,j)\forall j<i\wedge i_t-j_t\ge dis(i,j)(即从 jjii 所需要的时间小于等于第 jj 个鼹鼠和第 ii 个鼹鼠出现的时间差),则有转移方程 f[i]=max(f[i],f[j])f[i]=max(f[i],f[j])。类似与LIS,在取答案的最大值时需要将 f[i]f[i] 加上 11,因为最坏情况下也能打到 11 个鼹鼠。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e4+5,INF=0x3f3f3f3f; 
    int n,m,f[N],ans=-INF;
    struct node{
    	int t,x,y;
    }a[N];
    inline int dis(node x,node y){ // 曼哈顿距离
    	return abs(x.x-y.x)+abs(x.y-y.y);
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++)
    		scanf("%d%d%d",&a[i].t,&a[i].x,&a[i].y);
    	for(int i=1;i<=m;i++){
    		for(int j=1;j<i;j++)
    			if(a[i].t-a[j].t>=dis(a[i],a[j]))
    				f[i]=max(f[i],f[j]);
    		ans=max(ans,++f[i]);
    	}
    	printf("%d",ans);
    	return 0;
    }
    
    
    • 1

    信息

    ID
    800
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    85
    已通过
    44
    上传者