NOIP模拟18 T2
不知道为什么很多人拒绝这题打搜索。。。其实搜索在充分剪枝后时间是非常优秀的,不管数据怎样基本都可跑出
首先一个显然结论:对于某种状态,他抓到的小精灵一定是一个连续的区间。
因此我们可以枚举这个区间的左右端点,进行搜索,但是这样显然会T,我们考虑剪枝:
1.可行性剪枝,当前时间大于最大时间直接return(废话)
2.最优性剪枝,对于每种状态,我们用两个数组来记录出现这种状态所需要的最短时间,以及最短时间下的最优答案,若时间长答案还小,直接return
3.确定枚举方向,如果上一步从左向右走,那么当前必然向左走。很显然,若继续向右走,与上一次枚举的有重复。
4.一个比较玄学但是非常有用的剪枝:对于当前左右端点l,r,在枚举右端点时,从m处开始枚举到r+1,而不是从r+1枚举到m,左端点同理。看上去比较玄学,实际上是有一定原理的:若我们枚举到的端点离当前端点很近,那么会重复走很多位置,在大多数情况下浪费时间,往往无法得到最优解,而较远端点更可能获得更优的答案,结合剪枝2,会将较近端点剪掉,除去很多不必要搜索。
综合以上,我们就可以得到一个时间碾压正解的搜索(欢迎造数据hack)
附代码:
#include<bits/stdc++.h>
#define cri const register int
using namespace std;
int n,k,m,maxt,ans,ys[],yx[],f[][],ff[][];
char v[];
inline int abs(int x){return x<?-x:x;}
struct jing{
int a,b,t;
friend bool operator < (jing a,jing b){
return a.a<b.a;
}
}c[];
void dfs(cri ti,cri l,cri r,cri na,cri o){
if(ti<maxt)ans=max(ans,na);
if(ti>=maxt)return;
if(ti>=f[l][r]&&na<=ff[l][r]){
return;
}
if(f[l][r]>ti)f[l][r]=ti,ff[l][r]=na;
if(o!=){
int sum=;
for(int i=m+;i>=r+;i--)
if(ti+c[i].a-c[l].a<=c[i].t)
sum+=c[i].b;
for(int i=m+;i>=r+;i--){
if(ti+c[i].a-c[l].a<=c[i].t){
dfs(ti+c[i].a-c[l].a,l,i,na+sum,);
sum-=c[i].b;
}
}
}
if(o!=){
int sum=;
for(int i=l-;i>=;i--){
if(ti+c[r].a-c[i].a<=c[i].t){
sum+=c[i].b;
}
}
for(int i=;i<=l-;i++){
if(ti+c[r].a-c[i].a<=c[i].t){
dfs(ti+c[r].a-c[i].a,i,r,na+sum,);
sum-=c[i].b;
}
}
}
}
inline int read(){
int x=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
}
int main(){
memset(f,0x3f,sizeof(f));
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<=m;i++)
c[i].a=read(),c[i].b=read(),c[i].t=read(),maxt=max(maxt,c[i].t);
c[m+].a=k;c[m+].b=,c[m+].t=;
maxt++;
sort(c+,c+m+);
for(int i=;i<=m+;i++)
ys[c[i].a]+=c[i].b,yx[c[i].a]=i;
dfs(,yx[k],yx[k],ys[k],-);
printf("%d",ans);
return ;
}
NOIP模拟18 T2的更多相关文章
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
- noip模拟6(T2更新
由于蒟弱目前还没调出T1和T2,所以先写T3和T4.(T1T2更完辣! update in 6.12 07:19 T3 大佬 题目描述: 他发现katarina大佬真是太强了,于是就学习了一下kata ...
- NOIP模拟 18
这次时间分配不合理,沉迷大模拟无法自拔 虽然A了但是根本就没给T3留时间555 T3如果有时间看看数据范围应该可以想到QJ掉20分的555 T1 引子 打这题的时候感觉自己在做图像处理.. 然后调了各 ...
- noip模拟18
\(\color{white}{\mathbb{曲径通幽,星汉隐约,缥缈灯影,朦胧缺月,名之以:薄雾}}\) 放眼望去前十被我弃掉的 \(t2\) 基本都上85了-- 开考就以为 \(t2\) 是个大 ...
- Noip模拟18 2021.7.17 (文化课专场)
T1 导弹袭击(数学) 显然,我们要找到最优的A,B使得一组a,b优于其他组那么可以列出: $\frac{A}{a_i}+\frac{B}{b_i}<\frac{A}{a_j}+\frac{B} ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
- 20161003 NOIP 模拟赛 T2 解题报告
Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...
- NOIP模拟5 T2
题面:求出满足以下条件的 n*m 的 01 矩阵个数: (1)第 i 行第 1~li 列恰好有 1 个 1 (li+1到ri-1不能放1) (2)第 i 行第 ri~m 列恰好有 1 个 1. ...
- 20161023 NOIP 模拟赛 T2 解题报告
Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...
随机推荐
- FFmpeg(五) 重采样相关函数理解
一.重采样流程 重采样(解码音频数据之后格式不可以直接播放,需要重采样,类似图像的像素转换) 1.分配上下文 2.设置参数(分为(前几个是)输出格式和(后几个)输入格式,两个相对应的) 可以通过改变样 ...
- BeetleX服务网关之限流和缓存
限流和缓存相关是网关中两个非常重要的功能,前者是保障服务更可靠地运行,后者则可以大大提高应用的吞吐能力.Beetlex.Bumblebee微服务网关提供了两个扩展插件来实现这两个功能,分别是Beetl ...
- Spring Security 自定义登录认证(二)
一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...
- Label的作用是什么,是怎么用的?
label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到标签相关的表单控件上. 如: <form> <label for="male"&g ...
- 【TencentOS tiny】深度源码分析(4)——消息队列
消息队列 在前一篇文章中[TencentOS tiny学习]源码分析(3)--队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的, ...
- Head First设计模式——策略模式
1.继承带来的扩展和复用问题 继承作为面向对象的三大要素(封装.继承.多态)之一为什么会带来问题,问题如何解决然后形成一种设计模式,head frist设计模式书中以鸭子作为例子讲解什么情况下继承的方 ...
- window 下Notepad++设置为文本文件的默认打开程序失败
1.右键Notepad++的可执行程序,选择"属性" -- "兼容性" , 设置Notepad++以管理员的身份运行 2.打开Notepad++ ," ...
- SPDK发送和接收连接请求的处理
因工作需要分析了部分SPDK代码,主要梳理login请求以及响应的处理,供参考. 参考代码——SPDK代码实现(以PLOGI为例): SPDK处理PLOGI分为三个阶段: 第一阶段通过一条GET_PA ...
- java集合之ArrayList链表基础
ArrayList可变数组 : arrayList继承AbstractList抽象类,实现list接口,底层基于数组实现.可存放null,除了非同步的之外,大致等同Vector.适用快速访问,复制.序 ...
- Https工作流程图