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常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...
随机推荐
- Docker下配置nacos
前言 近段时间在学dubbo,dubbo-admin死活装不上,无论是本地还是docker,所以把目光投向了其他配置中心,我选定的是阿里新开源的nacos. 正文 拉取镜像到本地docker dock ...
- python3 中的reload(sys)和sys.setdefaultencoding('utf-8')
通常我们为了防止出现乱码会进行一下操作 import sys reload(sys) sys.setdefaultencoding('utf-8') 但这是python2的写法,但是在python3中 ...
- Loj10222佳佳的 Fibonacci
Description Analysis 10分:暴力+把m和n输反,你将获得10分的好成绩(Just like me.) 70分:暴力+把m和n输对,你将获得70分的好成绩 100分:矩阵加速 设 ...
- Linux下聊天和文件传输软件
全平台聊天软件 米聊 官网地址: http://www.miliao.com 潮信 官网地址: https://www.chaoxin.com
- 实验吧之【who are you?】(时间盲注)
地址:http://ctf5.shiyanbar.com/web/wonderkun/index.php 这道题点开看见your ip is :xxx.xxx.xx.xxx 试了一些 最后发现是XFF ...
- 机器学习:LibSVM与weka在eclipse中的使用
LibSVM是weka3.5以后的版本新加的功能,使用这个算法必须自己下载jar包,配置进项目: LibSVM在weka可视化界面的使用,很多人写过,但在clipse下的调用资料却不多,试了很多都不能 ...
- opencv实践::直线检测
问题描述 寻找英语试卷填空题的下划线,这个对后期的切图与自动 识别都比较重要. 解决思路 方法: 通过图像形态学操作来寻找直线,霍夫获取位置信息与显示. #include <opencv2/op ...
- jenkins中使用变量
查看jenkins内置变量: 1.新建一个job: 2.构建-增加构建步骤-执行shell: 3.点击 可用的环境变量列表 即可查看 如WORKSPACE : 作为工作空间分配给构建目录的绝对路径 ...
- jmeter-定时器使用
在一般性能测试过程中,往往在前一个请求之后等待一段时间再执行下一个请求,这时会用到定时器. 以下列举常用的3中: 1.固定定时器: 2.
- js检测页面上一个元素是否已经滚动到了屏幕的可视区域内
应用场景:只要页面加载了,其中在页面中出现的li就向控制台输出第几个发送请求:在本次加载的页面中,再将滚动条滚回前边的li,不再向控制台输出东西,也就是说已经显示过的li,不再向控制台输出东西. &l ...