首页 > 其他分享 >P11290 【MX-S6-T2】「KDOI-11」飞船 题解

P11290 【MX-S6-T2】「KDOI-11」飞船 题解

时间:2024-11-20 11:41:16浏览次数:1  
标签:11 LD log int 题解 GCC pragma P11290 include

注意到速度的形式是编号相乘,而又有 \(x \in \{1, 2, 3, 4\}\),所以最多 \(\log_2y_i\) 次速度就会达到 \(10^9\) 量级,而此时再加油最少需要 \(1\) 秒,所以再乘一定不优。

直接 dp,有 \(f_{i, j, k}\) 表示当前在第 \(i\) 个加油站,速度为 \(2^j3^k\) 的最短用时,后面的 \(2^j3^k\) 可以递推处理。

具体的,转移考虑当前加油站是否加油即可。

对于询问,二分出当前位置前面的第一个加油站,然后枚举终点状态计算答案即可。

复杂度 \(O(n\log_2y\log_3y + q\log_2 y\log_3y)\)。

// 如果命运对你缄默, 那就活给他看。
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast", "inline", "-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include <cfloat>
#include <iostream>
#include <cstring>
#include <tuple>
#include <iomanip>
#include <cassert>
using namespace std;
typedef long long LL;
// typedef long double LD;
typedef double LD; 
// #define int LL
const int maxn = 100010;
inline LD cmi(LD& x, LD y) { if(y < x) x = y; return x; }
struct Port {
  int p, t, x;
  Port () {}
  Port (int a, int b, int c) { p = a, t = b, x = c; }
} w[maxn];
int n, q;
LL ve[31][20];
LD f[maxn][31][20];
inline int Bound(int y) {
  int l = 0, r = n;
  while(l < r) {
    int mid = l + r + 1 >> 1;
    if(w[mid].p <= y) l = mid;
    else r = mid - 1;
  } return l;
}
signed main() {
  // freopen("ship2.in", "r", stdin);
  // freopen("ship.out", "w", stdout);
  ios :: sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  cin >> n >> q;
  for(int i = 1; i <= n; ++ i) {
    int p, t, x;
    cin >> p >> t >> x;
    w[i] = {p, t, x};
  }
  ve[0][0] = 1;
  for(int j = 1; j < 20; ++ j) ve[0][j] = ve[0][j - 1] * 3; 
  for(int i = 1; i <= 30; ++ i) {
    ve[i][0] = ve[i - 1][0] * 2;
    for(int j = 1; j < 20; ++ j) {
      ve[i][j] = ve[i][j - 1] * 3;
    }
  }
  for(int i = 0; i <= n; ++ i) {
    for(int j = 0; j <= 30; ++ j) {
      for(int k = 0; k < 20; ++ k) {
        f[i][j][k] = 1e18;
      }
    }
  }
  f[0][0][0] = 0;
  for(int i = 1; i <= n; ++ i) {
    auto [p, t, x] = w[i];
    for(int j = 0; j <= 30; ++ j) {
      for(int k = 0; k < 20; ++ k) {
        cmi(f[i][j][k], f[i - 1][j][k] + 1.0 * (w[i].p - w[i - 1].p) / ve[j][k]);
        int j2 = j, k2 = k;
        if(x == 2) j2 -- ;
        else if(x == 3) k2 -- ;
        else if(x == 4) j2 -= 2;
        if(j2 < 0 || k2 < 0) continue ;
        LL v = ve[j2][k2];
        LD nt = 1.0 * (w[i].p - w[i - 1].p) / v;
        cmi(f[i][j][k], f[i - 1][j2][k2] + t + nt);
      }
    }
  }
  for(int y; q -- ; ) {
    cin >> y;
    LD ans = DBL_MAX;
    int x = Bound(y);
    for(int i = 0; i <= 30; ++ i) {
      for(int j = 0; j < 20; ++ j) {
        LL v = ve[i][j];
        LD nt = 1.0 * (y - w[x].p) / v;
        cmi(ans, f[x][i][j] + nt);
      }
    }
    cout << fixed << setprecision(7) << ans << '\n';
  }
  return 0;
}

调的时候挂在了奇妙的地方:memset 一个 long double 数组 \(0x7f\) 会出来 nan /hsh。

标签:11,LD,log,int,题解,GCC,pragma,P11290,include
From: https://www.cnblogs.com/Rainsheep/p/18556557

相关文章

  • CF1678题解
    CF1678A小清新签到题,有0其余全与0合并,有相等的数先变为0再与0合并,没有相等的数先花1的代价合并为相等的数CF1678B因为最后对于一个合法的串,要求连续段长度为偶数,所以,我们只关心一个偶数位二元组\((1,2),(3,4)\dots\)两个对应的数是否相等若不相等,我们只能把这个数对全改为0......
  • 20241120
    一、实验目的深入理解决策树、预剪枝和后剪枝的算法原理,能够使用Python语言实现带有预剪枝和后剪枝的决策树算法C4.5算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试......
  • [CodeForces] CF558 题解
    注:难度评级为D到A,对标NOIPT1到T4。+表示比原本难,-反之。例如,D+比D难。难度评级仅供参考。如果认为难度评级与实际难度不符,可以在评论区@我进行讨论。本篇题解无复杂的公式推导,题目较清新自然,请放心食用。斜体字为说明提示。通常与多倍经验有关。A.LalaLandand......
  • 11.3
    状态模式当涉及状态模式的示例时,我们可以以一个简单的交通信号灯系统为例。在这个示例中,我们有三种状态:红灯、绿灯和黄灯。根据当前状态的不同,交通信号灯将采取不同的行为。首先,我们需要定义一个状态接口,表示交通信号灯的状态://状态接口publicinterfaceTrafficLightState{......
  • 11.2
    观察者模式下面是一个简单的观察者模式的示例代码,使用Java语言实现:importjava.util.ArrayList;importjava.util.List;//观察者接口interfaceObserver{voidupdate(Stringmessage);}//具体观察者类classConcreteObserverimplementsObserver{private......
  • 11.1
    备忘录模式下面是一个简单的备忘录模式的示例代码,使用Java语言实现://备忘录类classMemento{privateStringstate;publicMemento(Stringstate){this.state=state;}publicStringgetState(){returnstate;}}//发起......
  • 11.5
    模板方法模式模板方法模式是一种行为设计模式,它定义了一个算法的骨架,在抽象类中封装了算法的结构,具体的步骤由子类去实现,以达到在不改变算法结构的情况下,允许子类重定义算法中的某些步骤。下面是一个简单的Java代码示例,演示了模板方法模式的实现:abstractclassAbstractClass{......
  • 11.4
    策略模式策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装在独立的可互换的策略类中,使得算法可以独立于客户端而变化。下面是使用Java编写的一个简单的策略模式示例://策略接口interfacePaymentStrategy{voidpay(doubleamount);}//具体策略类1cla......
  • 关于湖北移动机顶盒CM311-1S长虹版本刷机的总结
    最近家里的机顶盒不好使了,就捣鼓了一下自己刷机,机顶盒是湖北移动的CM311-1s,长虹代工的,晶晨的S905L3处理器,2+8G的配置,用着也还行  这个版本的刷机需要拆机顶盒,找内部的短接点,就是背面这个“4R12”的电阻, 刷机需要用到USB双A头线,接靠近后排插座的那个口,插另一个上电会没......
  • Mit6.S081笔记Lab11: Network 网络设备驱动
    课程地址:https://pdos.csail.mit.edu/6.S081/2020/schedule.htmlLab地址:https://pdos.csail.mit.edu/6.S081/2020/labs/net.html我的代码地址:https://github.com/Amroning/MIT6.S081/tree/netxv6手册:https://pdos.csail.mit.edu/6.S081/2020/xv6/book-riscv-rev1.pdf相关翻译......