[CSP-S模拟测试]:可爱的精灵宝贝(搜索)
题目描述
$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模拟测试]:可爱的精灵宝贝(搜索)的更多相关文章
- NOIP模拟测试2「排列 (搜索)·APIO划艇」
排序 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目描述 输入格式 数据范围与提示 对于30%的数据,1<=N<=4: 对于全部的数据,1<=N< ...
- [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)
传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...
- 2019.8.12 NOIP模拟测试18 反思总结
写个博客总是符合要求的对吧 回来以后第一次悄悄参加考试,昨天全程围观… 然后喜提爆炸120分wwwwwwwww T1用了全机房最慢的写法,导致改掉死循环T掉的一个点以后还是死活过不了最后一个点.T2全 ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
- 安装nginx python uwsgi环境 以及模拟测试
uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 转 C#实现PID控制的模拟测试和曲线绘图
C#实现PID控制的模拟测试和曲线绘图 本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
随机推荐
- 机器学习--如何将NLP应用到深度学习(3)
数据收集以后,我们下面接着要干的事情是如何将文本转换为神经网络能够识别的东西. 词向量 作为自然语言,只有被数学化才能够被计算机认识和计算.数学化的方法有很多,最简单的方法是为每个词分配一个编号, ...
- Java ——Number & Math 类 装箱 拆箱 代码块
本节重点思维导图 当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等 int a = 5000; float b = 13.65f; byte c = 0 ...
- 【ABAP系列】SAP ABAP ALV里日期类型的F4帮助
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP ALV里日期类 ...
- ABI与API的区别
ABI是定义二进制级别的,两个模块的接口 比如一个二进制模块想要调用另外一个二进制模块提供的功能,它需要知道怎样通过汇编语言(即机器指令)去调用,以及怎样传递相应的参数和返回值(通过寄存器还是栈内存, ...
- Trailing Zeroes (III) LightOJ - 1138 不找规律-理智推断-二分
其实有几个尾零代表10的几次方但是10=2*510^n=2^n*5^n2增长的远比5快,所以只用考虑N!中有几个5就行了 代码看别人的: https://blog.csdn.net/qq_422797 ...
- ceph部署-基础部署
一.硬件要求:CPU:4C内存:每个守护进程需要500MRAM,1TB存储对应1GRAM磁盘:至少1TB网卡:1GB以上,最好两个 centos7环境安装 二.CEPH安装1.建立管理节点(1)添加y ...
- linux下的dd命令使用详解
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- ubuntu终端代理之proxychains
命令行代理 安装proxychains sudo apt install proxychains 配置proxychains sudo vim /etc/proxychains.conf 在proxy ...
- ListView鼠标拖
private Point Position = new Point(0, 0); private void treeFileView_ItemDrag(object sender, ItemDrag ...
- STM32之红外遥控信号自学习实现
一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...