洛谷P11290 【MX-S6-T2】「KDOI-11」飞船

news/2025/2/24 10:34:18/文章来源:https://www.cnblogs.com/yiweixxs/p/18566493

Problem


本题开启Special Judge,无需考虑精度问题

Solve

一开始想到这个用DP写,但是不知道怎么定义
去"提交记录"旁边的神秘按钮得知速度可以作为第二维,且类似于背包
那么我们就可以按照背包列出定义 前i个加油站,花费时间j......
但是这里是求最小花费,所以我们要把 类似于最大价值 的速度变成第二维度,但是这样数组开不了,可以进行如下定义
\(f_{i,j,k}\)到第i个加油站,速度为\(2^j\times 3^k\)时的最小用时
注意不要被思维限制了,速度可以作为第二维度!
那这样就好办了,我们每次对于每个状态只需要枚举是否在第i-1个加油站加油就行了
找答案的时候先把询问离线,再等到推出它的前面的加油站时再算上余下路程即可
最后开数组的时候发现开不下,滚动数组优化即可
时间复杂度\(O((n+q)k)\)

这道题的时间卡的有些紧张,常数太大会G,能离线的全部离线
而且存在细节需要多加注意(加上的路程需要考虑此加油站等等...)

Code

#include<bits/stdc++.h>
using namespace std;
int n,q[100005];
map<int,double> ans;
struct p{int p,t,x;
}a[100005];
double f[40][25],g[40][25],pf[40][25];
double ff(int x,int y){double sum=1;for(int i=1;i<=x;i++)sum*=2;for(int i=1;i<=y;i++)sum*=3;return sum;
}
int main(){for(int i=0;i<40;i++){for(int j=0;j<25;j++){pf[i][j]=ff(i,j);}}for(int i=0;i<40;i++){for(int j=0;j<25;j++){f[i][j]=g[i][j]=0x3f3f3f3f;}}scanf("%d%d",&n,&q[0]);for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i].p,&a[i].t,&a[i].x);}a[0]={0,1,1};a[n+1].p=2e9;g[0][0]=0;for(int i=1;i<=q[0];i++){scanf("%d",&q[i]);ans[q[i]]=i;}map<int,double>::iterator it=ans.begin();int a1=2e9,b1=2e9,c1=a1+b1;for(int i=1;i<=n;i++){int u=0,v=0;if(a[i-1].x==1)true;else if(a[i-1].x==2)u=1;else if(a[i-1].x==3)v=1;else u=2;for(int j=0;j<=30;j++){for(int k=0;k<=19;k++){if(pf[j][k]>1e9)break;f[j][k]=min(f[j][k],g[j][k]+(a[i].p-a[i-1].p)/pf[j][k]);if(j>=u&&u){f[j][k]=min(f[j][k],g[j-u][k]+1.0*(a[i].p-a[i-1].p)/pf[j][k]+a[i-1].t);}if(k>=v&&v){f[j][k]=min(f[j][k],g[j][k-v]+1.0*(a[i].p-a[i-1].p)/pf[j][k]+a[i-1].t);}}}memcpy(g,f,sizeof(f));while(it!=ans.end()&&it->first<a[i+1].p){int pos=it->first;double tmp=0x3f3f3f3f;for(int j=0;j<=30;j++){for(int k=0;k<=19;k++){if(pf[j][k]>1e9)break;tmp=min(tmp,f[j][k]+1.0*(pos-a[i].p)/pf[j][k]);tmp=min(tmp,f[j][k]+1.0*(pos-a[i].p)/(pf[j][k]*a[i].x)+a[i].t);}}ans[it->first]=tmp;it++;}for(int j=0;j<40;j++){for(int k=0;k<25;k++){f[j][k]=0x3f3f3f3f;}}}for(int i=1;i<=q[0];i++){if(ans[q[i]]>0)printf("%.8f\n",ans[q[i]]);else cout<<q[i]<<endl;}return 0;
}

此代码的计循环次数能到6e8,总运算次数能达到1e9级别,洛谷神机还是给力的(未开O2能达到约5e8/sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/840595.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Analogue Pocket 软硬件实验预告

如题,还在测试中,预计会在今年内发布。

.NET云原生应用实践(六):多租户初步

本章目标多租户简介 实现public租户下的用户数据隔离出于开发进度考虑,本章暂不会完全实现多租户的整套体系,而是会实现其中的一小部分:基于默认public租户的数据隔离,并在本章节中会讨论多租户的实现框架结构。在后续的系列文章章节中,我们会完成多租户的实现。多租户(M…

【MX-S7】梦熊 NOIP 2024 模拟赛 3 SMOI Round 2

hdk俩签到俩不可做是吧。Rank【MX-S7-T1】「SMOI-R2」Happy Card 签到题一号,以为撑死评个黄但没想到那么多人不会打扑克。 考虑炸弹也是三带一,出三带一肯定更优秀。 考虑将所有牌变为若干个三张和剩余的,那么三张先带单张,再将对子拆开带。那么现在就有以下几种情况:单张…

我勒湘军杯

今天以体验队参加了湘军杯,感觉和ctf差别挺大 使用sql注入、xss等方式对靶场漏洞进行挖掘,漏洞挖掘感觉需要把知识系统的利用起来, 虽然也是ctf的知识,但是感觉ctf的目标很明确,获取flag就结束,而且可以在网上搜索到类似的步骤解题

Springboot如何利用模板,快速生成word文档?

前言 大家好,我是小徐啊。我们在使用SpringBoot开发的时候,有时候会遇到需要生成word文档的情况。一般情况下,就是将一些数据填充到word文档里面。其实Java是有开源的第三方jar包的。今天,小徐就来介绍下如何在SpringBoot里面生成word文档。 如何设置 首先,我们需要在pom.…

HCIA-03 常用协议 ARP TCP UDP ICMP

主要介绍了常用协议和IP协议的基础知识, 包括TCP/UDP协议的工作原理、ARP地址解析协议的作用、ICMP协议用于网络控制和查询的信息传递等。 重点讲述了TCP协议的三次握手建立连接、数据传输与四次挥手断开连接的过程 以及IP协议在网络层实现跨广播域通信的基本原理。 此外,还提…

DDD之理解复杂度、尊重复杂度、掌控复杂度

本文书接上回《懂了这个道理,人月神话不再是神话!》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。关注公众号一定要星标,以及时获得最新推送。 背景 关于“复杂度”我在系列…

树的遍历顺序及其应用

树的遍历顺序及其应用 一、DFS 序 DFS 序就是以 DFS 的方式,记录每一个节点第一次被访问的顺序,这种顺序形成一个形成一个长度为 \(n\) 的序列。主要被用来维护子树信息。有以下特点:对于任意一个点来说,其子树里所有点的 DFS 序是连续的,具体来讲, \(x\) 的子树的所有结…

视野修炼-技术周刊第111期 | 读文件 API 性能对比

① Node.js 与 Bun 读取文件速度对比 ② 2024 HTML现状调研 ③ Viselect - 直观的 DOM 选择 ④ fraction.js - 精确的十进制运算库 ⑤ npmpackage.info - 在线查看 npm 包相关概览信息 ⑥ dive - 展示 docker 镜像里层的内容 ⑦ lcl.host - 一键本地生SSL证书 ⑧ 12 个现代CSS技…

[CPP]继承

继承友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。什么是继承 继承是面向对象编程(OOP)中的一个重要概念,它是一种创建新类(称为派…

MIT 操作系统6.S081第一章

1.1进程和内存 fork 父进程中 fork 返回 子进程的PID 子进程中 fork 返回 0 exit exit会让当前进程停止执行并释放资源(包括内存和打开的文件) 通常: 0 表示 成功 1 表示 失败 wait wait 系统调用并返回当前进程已退出或杀死的进程PID,并将子进程的状态复制到wait的地址 另…

TIA 做交通信号灯控制练习1

练习一下交通信号灯程序,从简单的功能做起。红绿黄等交替亮起。使用TIA编程,做成FB。新建一个TIA项目,选择一个1200CPU. 1. 新建一个FB,在新建的FB,先配置输入输出变量。 2. 在FB写下面的程序3. 在WINCC上建立1200?1500的变量连接,连接博图模拟器,建立变量。4.WINCC画…