不知道为什么很多人拒绝这题打搜索。。。其实搜索在充分剪枝后时间是非常优秀的,不管数据怎样基本都可跑出

  首先一个显然结论:对于某种状态,他抓到的小精灵一定是一个连续的区间。

  因此我们可以枚举这个区间的左右端点,进行搜索,但是这样显然会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的更多相关文章

  1. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  2. noip模拟6(T2更新

    由于蒟弱目前还没调出T1和T2,所以先写T3和T4.(T1T2更完辣! update in 6.12 07:19 T3 大佬 题目描述: 他发现katarina大佬真是太强了,于是就学习了一下kata ...

  3. NOIP模拟 18

    这次时间分配不合理,沉迷大模拟无法自拔 虽然A了但是根本就没给T3留时间555 T3如果有时间看看数据范围应该可以想到QJ掉20分的555 T1 引子 打这题的时候感觉自己在做图像处理.. 然后调了各 ...

  4. noip模拟18

    \(\color{white}{\mathbb{曲径通幽,星汉隐约,缥缈灯影,朦胧缺月,名之以:薄雾}}\) 放眼望去前十被我弃掉的 \(t2\) 基本都上85了-- 开考就以为 \(t2\) 是个大 ...

  5. Noip模拟18 2021.7.17 (文化课专场)

    T1 导弹袭击(数学) 显然,我们要找到最优的A,B使得一组a,b优于其他组那么可以列出: $\frac{A}{a_i}+\frac{B}{b_i}<\frac{A}{a_j}+\frac{B} ...

  6. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  7. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  8. NOIP模拟5 T2

    题面:求出满足以下条件的 n*m 的 01 矩阵个数:   (1)第 i 行第 1~li 列恰好有 1 个 1 (li+1到ri-1不能放1)   (2)第 i 行第 ri~m 列恰好有 1 个 1. ...

  9. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

随机推荐

  1. JAVA MyBatis配置文件用properties引入外部配置文件

    方式一:通过properties 元素的子元素来传递数据 例如: <properties> <property name="driver" value=" ...

  2. LeetCode初级算法--字符串01:反转字符串

    LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  3. 使用Xming显示Oracle Linux图形界面

    如果你在尝试各种官方说明文档中的方法之后,xclock仍然无法远程显示. 系统 Win10 - Oracle Linux 7.5 Xming的文档以及网上教程都说的是Xming相关的配置 但是,要显示 ...

  4. main(argc, char *argv[])

    #include<stdio.h> int main(int argc, char *argv[]) { int i; ;i<argc;i++) { printf("arg ...

  5. 从源码的角度彻底搞懂 HandlerMapping 和 HandlerAdapter

    彻底搞懂 HandlerMapping和HandlerAdapter 知识点的回顾: 当Tomcat接收到请求后会回调Servlet的service方法,一开始入门Servlet时,我们会让自己的Se ...

  6. muduo Library

    muduo是由陈硕(http://www.cnblogs.com/Solstice)开发的一个Linux多线程网络库,采用了很多新的Linux特性(例如eventfd.timerfd)和GCC内置函数 ...

  7. comparator接口实现时,只需要实现 int compare(T o1, T o2)方法?

    从Comparator接口的源码,可以看到Comparator接口中的方法有三类: 1 普通接口方法 2 default方法 3 static方法 其中default方法和static方法 是java ...

  8. opencv::轮廓周围绘制矩形框和圆形框

    基于RDP算法实现,目的是减少多边形轮廓点数 approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool ...

  9. spark上 spark-shell和java -jar访问hdfs路径问题

    部署spark集群 使用spark包 spark-1.0.2-bin-hadoop2.tgz 在spark-shell和java -jar访问hadoop hdfs上的文件写法是有区别的 在spark ...

  10. 压敏电阻的保护作用—NDF达孚电子科技

    压敏电阻是常见的电子元器件之一,它的保护作用被大家熟知和运用.压敏电阻的主要用于在电路承受过压时进行电压钳位,吸收多余的电流以保护灵敏器件.压敏电阻的导电特性随着施加电压的变化呈非线性变化,它能保护电 ...