首页 > 其他分享 >[刷题笔记] Luogu P2285 [HNOI2004] 打鼹鼠

[刷题笔记] Luogu P2285 [HNOI2004] 打鼹鼠

时间:2023-08-23 21:45:09浏览次数:47  
标签:int Luogu 鼹鼠 HNOI2004 显然 max include P2285 qwq

Problem

Analysis

我们初始可以任意决定机器人的位置,状态很多,暴力显然会寄掉。

不妨先贪心的思考一下。我们肯定希望机器人初始在最先出现鼹鼠的洞,因为出现在没有鼹鼠的洞是无效的。

题目保证输入数据是严格按照出现时间递增顺序给出。定义 \(f_i\) 表示前 \(i\) 只鼹鼠最多能打到多少个。如果能在时间内从 \(j\) 走到 \(i(\forall j <i)\),则可以转移,取最大值即可。

我们显然希望同样走到 \(i\) 号鼹鼠能打到的最多。如果没有打到最多,则一定不是最优解。(由于机器人可以任意决定初始位置,所以走到 \(i\) 号鼹鼠默认是满足在打到它的前提下,因为最坏情况就是只打它自己)

转移的时候我们只需要考虑鼹鼠位置之间的转移即可,至于如何行走我们是可以直接求出来的。

至此,我们就把这道题转换成了 二维最长上升子序列模型?。虽然需要判断的条件更多,但其实非常类似。

Code

/*
二维最长不下降子序列模型?

设 $f_i$ 表示前 $i$ 只鼹鼠最大能打到多少。显然我们鼹鼠出现的时间是按照顺序输入的。

每次如果能从 $j$ 走到 $i$ ,也就是能在时间限制内走到鼹鼠,则可以打。取max即可
即 $f_i = max(f_i,f_j+1)$

我们显然期望在前 $i$ 只鼹鼠中能打到尽可能多的,否则下次利用就不是最大的。

同时前 $i$ 只鼹鼠打多少都不影响后面如何打,因为第 $i$ 只鼹鼠出现的时间是固定的。符合无后效性,局部最优解。

显然也避免了重复。

需要注意 $ans = max(f)$ 我们需要在全程取 max ,显然不一定能打到 $n$ ,也不一定打 $n$ 就是 max
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1000100;
int n,m;
struct Node
{
    int t,x,y;
}qwq[N];
int f[N];
int maxn = 0;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++) cin>>qwq[i].t>>qwq[i].x>>qwq[i].y,f[i] = 1;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<i;j++)
        {
            int lenx = abs(qwq[i].x - qwq[j].x);
            int leny = abs(qwq[i].y - qwq[j].y);
            if(lenx + leny  <= abs(qwq[i].t-qwq[j].t))
            {
                f[i] =max(f[i],f[j]+1);
            }
        }
        maxn = max(maxn,f[i]);
    }
    cout<<maxn<<endl;
    return 0;
}

标签:int,Luogu,鼹鼠,HNOI2004,显然,max,include,P2285,qwq
From: https://www.cnblogs.com/SXqwq/p/17652834.html

相关文章

  • [刷题笔记] Luogu P4933 大师
    ProblemDescription给定一个长度为\(n\)的数组\(h\),你可以从中选取若干数字,使得你选择的数组组成一个等差数列。特别地,单一的数字和只有两个数字也算作等差数列。求你可选择的方案数。答案对\(998244353\)取模。Analysis考虑\(f_{i,j}\)表示前\(i\)个数,公差为\(j\)......
  • [刷题笔记] Luogu P1064 [NOIP2006 提高组] 金明的预算方案
    ProblemAnalysis我们发现如果忽略主从关系,那这道题就是一个裸的01背包问题。主从关系处理也非常简单,借鉴P2014选课的经验,转换成树上背包问题。同理,本题是一个森林,若将0号节点参与建树的话就可以把森林转换成树,处理方便。具体地,设\(f_{i,j}\)表示以\(i\)为父节点,剩......
  • [刷题笔记] Luogu P2679 [NOIP2015 提高组] 子串
    ProblemDescription我们可以换个思路。从字符串\(A\)中拿出\(k\)个字串使其变成\(B\)。求有几种不同的方案?Analysis我们发现\(A\)中的一个字符取或者不取影响后面的决策,这并不代表它一定有后效性,我们可以记录这一层状态。和最长公共子序列同理,定义\(f_{i,j,k,l}(\fo......
  • [刷题笔记] [【LGR-155-Div.3】T4] Luogu P9572 「NnOI R2-T4」Colorful Days♪
    ProblemDescription有两个数组\(A,B\),我们可以将\(A\)数组无限次重复拼接。求最少需要多少次拼接使得拼接后的\(A,B\)的最长公共子序列最大。Analysis我们要学会从题目中找到一些信息,比如说本题的数据范围:对于\(100\%\)的数据,保证\(1\leqn,m,S_i,T_i\le10^6\),\(......
  • Luogu P1119 灾后重建
    在洛谷中查看解法1(我想的解法,不完全正确):很常见的套路:将询问按时间排序。时间复杂度:\(O(\;q\,(n\,logn+m)\;)\),即\(10^9\),开\(O2\)才能过。非常麻烦有没有,但我对拍的时候发现了一组数据很奇怪,待会给你们看看,我看看能不能hack#include<bits/stdc++.h>usingnamespacestd......
  • 【LuoGu 1363】幻象迷宫——深度优先搜索 + 读题
    幻象迷宫题目背景(喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫。)WD:呜呜,肿么办啊……LHX:momo...我们一定能走出去的!WD:嗯,+U+U!题目描述幻象迷宫可以认为是无限大的,不过它由若干个\(N\timesM\)的矩阵重复组成。矩阵中有的地......
  • Luogu P3369 【模板】普通平衡树 01Tire树解法
    题目传送门闲话:Luogu总共105篇题解中只有4篇01Tire树解法,虽说是非正解但未免也太少了些(貌似也不少?)……总之01Tire树的效率并不低,这道题用01Tire是很轻松的。Q:这题为什么可以用01Tire树解?能否解决一个问题,无非于三个点:可行性,空间,时间。本题要求维护一个有序数集,能进行元素修改......
  • 牛的旅行 luoguP1522 多余的换行造成的影响
    牛的旅行#include<bits/stdc++.h>usingnamespacestd;intread(){intf=1,x=0;charc=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){......
  • Luogu P9510 『STA - R3』高维立方体 题解
    题目传送门没见过这玩意,写个题解记下。题目大意周知斐波那契数列定义为:\[\operatorname{fib}(n)=\left\{\begin{aligned}1&&n\le2\\\operatorname{fib}(n-1)+\operatorname{fib}(n-2)&&n>2\end{aligned}\right.\]然后定义(\(n\le0\)函数值为\(0\))\[f(n)......
  • [Luogu P8716] 回文日期 题解
    STEP1:分析题目大意:给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。这一题一眼看出是P2010的升级版,所以要先考虑到超时问题,因为如果一天一天地枚举,时间复杂度会非常高,所以我们不能直接枚举。因为题目只要"回文",所以我们只......