题目描述

$Branimirko$是一个对可爱精灵宝贝十分痴迷的玩家。最近,他闲得没事组织了一场捉精灵的游戏。游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由$1$到$n$。
刚开始玩家在$k$号房子前。有$m$个精灵,第$i$只精灵在第$A_i$栋房子前,分值是$B_i$,以及它在$T_i$秒内(含)存在,之后消失。$Branimirko$可以选择移动至相邻的房子,耗时$1$秒。抓住精灵不需要时间,精灵被抓住后消失。时间从第$1$秒开始。$Branimirko$能最多获得多少分值和。


输入格式

输入的第$1$行为三个正整数$n$,$k$,$m$。
接下来$m$行描述精灵的信息,分别为$A_i$,$B_i$,$T_i$。


输出格式

输出$Branimirko$能最多获得多少分值和。


样例

样例输入:

10 5 4
1 30 4
3 5 7
7 10 12
9 100 23

样例输出:

115


数据范围与提示

样例解释:

很遗憾,它恰好不能抓住在一号房子前的精灵。
如果$T_1$改成$5$,答案就是$145$。

数据范围:

$20\%$的数据:$m\leqslant 10$。
$40\%$的数据:$m\leqslant 20$。
$k\leqslant n\leqslant 1000,m\leqslant 100,A_i\leqslant N,B_i\leqslant 100,T_i\leqslant 2,000$,所有数为正整数。


题解

正解是个$DP$,我不会,所以我来打搜索。

首先,我们要明确两点:

 $\alpha.$第一次到的时候就把当前位置的精灵(如果有的话)抓走,肯定不劣。

 $\beta.$如果没有抓到精灵就回头肯定是不优的。

 $\gamma.$如下图中:

  

  假设$1,2,3$都有精灵,而我们要去$1$抓精灵,那么可以分解为:先去$2$抓精灵,然后再到$1$抓精灵。

根据如上三条性质,我们的搜索分为两种情况:

 $\alpha.$向左走,抓第一只能抓到的精灵。

 $\beta.$向右走,抓第一只能抓到的精灵。

时间复杂度降低了不少,更是可以通过预处理接着降低时间复杂度。

对比大概是这样子的:

搜索:

正解:

时间复杂度:$\Theta($玄学$)$。

期望得分:$40$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int a,b,t,id;}e[200];
int n,k,m;
int ans;
bool vis[1001],wzc[200];
int minr;
bool cmp(rec a,rec b){return a.a<b.a;}
void dfs(int x,int w,int t)
{
for(int i=e[x].id;i;i--)
if(e[i].t>=abs(e[x].a-e[i].a)+t&&!wzc[i])
{
wzc[i]=1;
dfs(e[i].id,w+e[i].b,t+abs(e[x].a-e[i].a));
wzc[i]=0;
break;
}
for(int i=e[x].id;i<=m;i++)
if(e[i].t>=abs(e[x].a-e[i].a)+t&&!wzc[i])
{
wzc[i]=1;
dfs(e[i].id,w+e[i].b,t+abs(e[x].a-e[i].a));
wzc[i]=0;
break;
}
ans=max(ans,w);
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].t);
vis[e[i].a]=1;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++)e[i].id=i;
for(int i=1;i<=m;i++)if(e[i].a>=k){minr=e[i].id;break;}
if(!minr){dfs(m,0,abs(e[m].a-k)+1);goto nxt;}
if(e[minr].a==k)dfs(e[minr].id,0,1);
else
{
dfs(e[minr-1].id,0,abs(e[minr-1].a-k)+1);
dfs(e[minr].id,0,abs(e[minr].a-k)+1);
}
nxt:;
cout<<ans<<endl;
return 0;
}

rp++

[CSP-S模拟测试]:可爱的精灵宝贝(搜索)的更多相关文章

  1. NOIP模拟测试2「排列 (搜索)·APIO划艇」

    排序 内存限制:128 MiB 时间限制:1000 ms 标准输入输出     题目描述 输入格式 数据范围与提示 对于30%的数据,1<=N<=4: 对于全部的数据,1<=N< ...

  2. [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)

    传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...

  3. 2019.8.12 NOIP模拟测试18 反思总结

    写个博客总是符合要求的对吧 回来以后第一次悄悄参加考试,昨天全程围观… 然后喜提爆炸120分wwwwwwwww T1用了全机房最慢的写法,导致改掉死循环T掉的一个点以后还是死活过不了最后一个点.T2全 ...

  4. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  5. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  6. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  7. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  8. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  9. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

随机推荐

  1. JDK和SDK的区别:

    参考链接:https://www.cnblogs.com/vaelailai/p/7976158.html jdk,是Java开发工具包,主要用于编写Java程序:也就是说你要使用Java语言,就需要 ...

  2. Policy Improvement and Policy Iteration

    From the last post, we know how to evaluate a policy. But that's not enough, because the purpose of ...

  3. 浅谈Vue中的$set的使用

    在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去: 当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新 ...

  4. Mac入门--如何使用brew安装多个PHP版本

    一 安装7.1 1. 安装PHP7.1 brew install php@7.1 2. 修改配置 php-fpm.conf,一般在/usr/local/etc/php下(如果php-fpm.conf中 ...

  5. 21次C++作业

    //第一题目 class A //A为基类 {public: void f1( ); int i; protected: void f2(); int j; private: int k; }; /* ...

  6. Java-多线程第四篇线程池

    1.什么是线程池. 线程池在系统启动的时候即创建大量的空闲的线程,程序将一个Runnable对象或者Callable对象传给线程池,线程池就会启动一个线程来执行它们的run()或者call()方法,当 ...

  7. HDFS镜像文件fsimage和编辑日志文件edits

    镜像文件和编辑日志文件 1)概念 namenode被格式化之后,将在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current目录中产生如下文件 edits_ ...

  8. 数组去重,排序,重复次数,两个数组合并,两个数组去重,map(),filter(),reduce()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 手写ORM持久层框架(转)

    工程结构: 本文测试的数据库为: 其中student的表结构为: 表数据: 配置文件 DB2.properties driver=com.mysql.jdbc.Driver url=jdbc\:mys ...

  10. Untiy3D的游戏物体的实例和刚体的使用

    一,如下代码, GameObject b = GameObject.Instantiate(bullet, transform.position, transform.rotation) as Gam ...