评测链接:http://www.luogu.org/problem/show?pid=1594

题目描述 Description

护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥。因为街道是一条单行道,所以任何车辆都不能超车。桥能承受一个给定的最大承载量。为了控制桥上的交通,桥两边各站一个指挥员。护卫车队被分成几个组,每组中的车辆都能同时通过该桥。当一组车队达到了桥的另一端,该端的指挥员就用电话通知另一端的指挥员,这样下一组车队才能开始通过该桥。每辆车的重量是已知的。任何一组车队的重量之和不能超过桥的最大承重量。被分在同一组的每一辆车都以其最快的速度通过该桥。一组车队通过该桥的时间是用该车队中速度最慢的车通过该桥所需的时间来表示的。问题要求计算出全部护卫车队通过该桥所需的最短时间值。

输入输出格式 Input/output

输入格式:

输入文件第一行包含三个正整数(用空格隔开),第一个整数表示该桥所能承受的最大载重量(用吨表示);第二个整数表示该桥长度(用千米表示);第三个整数表示该护卫队中车辆的总数(n<1000)。接下来的几行中,每行包含两个正整数W和S(用空格隔开),W表示该车的重量(用吨表示),S表示该车过桥能达到的最快速度(用千米/小时表示)。车子的重量和速度是按车子排队等候时的顺序给出的。

输出格式:

输出文件应该是一个实数,四舍五入精确到小数点后1位,表示整个护卫车队通过该桥所需的最短时间(用分钟表示)。

输入输出样例 Sample input/output

输入样例:

100 5 10
40 25
50 20
50 20
70 10
12 50
9 70
49 30
38 25
27 50
19 70

输出样例:

75.0

解析:动态规划+rmq;

首先,所有车辆是排成一列通过该桥,这个顺序是不变的,我们就可以把车辆看成一条线上的有序点,这个时候就应当想到是否能用动态规划来解决这道题,并向这个方面思考。

我们用 f[i] 表示前 i 辆车通过大桥的最短时间,v(i,j) 表示从 第 i 辆到第 j 辆车之间(包括i,j)的最小行驶速度,zo(i,j)表示从 i 到 j 辆车的总重,weight表示桥的承受重量,那么大致思路如下:

for(i=1;i<=n;i++)

for(j=i-1;j>=1;j--)

{

f[i]=length/v[i];(最后一组只包含 i 车 );

if(zo(j,i)>weight)break;(若第 j 辆车加入最后一组车队,能否通过大桥)

                           f[i]=min(f[i],f[j-1]+length/v(i,j));(第 j 辆车加入最后一组)

}

具体的思路如上,代码实现就看个人了。

关于求v(i,j),也就是求 第 i 辆到第 j 辆车之间(包括i,j)的最小行驶速度,可以用线段树,也可以用更简单的st算法(我在这里用的是st算法)。

代码:

#include<cstdio>
#include<algorithm>
#define maxn (1000+100)
using namespace std;int weight,length,n;
int a[20],low[maxn][20],w[maxn];
double f[maxn];
void readdata()
{scanf("%d%d%d",&weight,&length,&n);int i,j,k;  for(i=1;i<=n;i++)scanf("%d%d",&w[i],&low[i][0]);for(i=a[0]=1;i<=10;i++)a[i]=a[i-1]*2;  low[0][0]=100000000;for(j=1;j<=10;j++)for(i=0;i<=n-a[j]+1;i++)low[i][j]=min(low[i][j-1],low[i+a[j-1]][j-1]);
}inline int getmin(int l,int r)
{int xiao=100000000,i;for(i=9;i>=0;i--)if(l+a[i]-1<=r)return min(low[l][i],low[r-a[i]+1][i]);
}void work()
{int i,j,k,zo;f[0]=0;for(i=1;i<=n;i++){zo=w[i];f[i]=f[i-1]+((double)length)/low[i][0];for(j=i-1;j>=1;j--)if(zo>weight-w[j])break;else f[i]=min(f[i],f[j-1]+((double)length)/getmin(j,i)),zo+=w[j];  }f[n]*=60;  printf("%.1lf\n",f[n]);
}int main()
{readdata();work();return 0;
}

洛谷1594 护卫队 (st算法)相关推荐

  1. 洛谷1594 护卫队

    洛谷1594 护卫队 本题地址: http://www.luogu.org/problem/show?pid=1594 题目描述 护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是 ...

  2. 洛谷1594 护卫队_区间dp_题解

    护卫队 出自洛谷题库 https://www.luogu.com.cn/problem/P1594 [问题描述] 不是具体题目 大概就是有n个车要过河,只有一个桥(理论上只能单向通行,其实不用管对面) ...

  3. 洛谷1594 护卫队(动态规划) 解析

    题目 护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是一条单行道,所以任何车辆都不能超车.桥能承受一个给定的最大承载量.为了控制桥上的交通,桥两边各站一个指挥员.护卫车队被分成几 ...

  4. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

  5. 洛谷 P1816 忠诚 ST函数

    题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...

  6. 洛谷 P1594 护卫队

    题目描述 护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是一条单行道,所以任何车辆都不能超车.桥能承受一个给定的最大承载量.为了控制桥上的交通,桥两边各站一个指挥员.护卫车队被分 ...

  7. 【模板】【洛谷P5487】—Berlekamp-Massey算法

    传送门 可以用来求解数列的最短常系数线性递推式 即一个长度为mmm的数列rrr满足对于i∈[m+1,n]i\in[m+1,n]i∈[m+1,n] 满足Ai=∑j=1mAi−jrjA_i=\sum_{j ...

  8. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  9. 洛谷 1972 莫队

    洛谷 1972 莫队算法 传送门 其实这道题的标答应该是树状数组或者线段树吧,,,如果我没记错的话曾经是做过类似题目的,,, 然而,,然而,, 好吧开始正题,这道题目我选择的是莫队算法,引用一下某大犇 ...

最新文章

  1. Debain 7.2安装配置
  2. 写SpringBoot项目的时候,报错Ordinal parameter not bound
  3. ASP.NET MVC easyUI-datagrid 分页
  4. MYSQL查表的字段名称,字段类型,字段长度,字段注释的SQL语句
  5. 计算机控制系统a卷-答案,计算机控制系统2010-2011年试题A答案
  6. js的tree数组对象扁平化思否_JS专题之数组展开
  7. 边缘设备上的实时AI人员检测:以实时模式检测视频中的人员
  8. 解决Vue项目报错:Expected indentation of 2 spaces but found 4. eslint(indent) [8, 1]的方法
  9. 5G时代到来,那我们现在用的4G手机怎么办?
  10. 人脸识别门禁系统java实现_java实现人脸识别源码【含测试效果图】——前台显示层(index.jsp)...
  11. python3.8入门教程完整版_Python 3.8从入门到精通(视频教学版)
  12. MTK7620A FLASH W25Q256学习
  13. 抹机王怎么一键新机_ir新机工具箱手机版下载-ir新机抹机王盒子v5.6.6 免登陆版-007游戏网...
  14. 超简单安装油猴(tampermonkey)脚本及使用教程
  15. 桌面终端是计算机吗,桌面和终端
  16. 灵异问题,使用EasyConnect后,用navicat可以访问数据库,但是用Idea跑项目连接超时怎么办?
  17. QT学习记录 --- 获取文件哈希值
  18. 用echarts实现水滴图效果
  19. java 基本语法
  20. matlab app设计步骤_1.1数学建模与MATLAB–MATLAB入门

热门文章

  1. 2022年,文献检索与利用期末考试答案(仅供参考)
  2. 【转】香港电台知名主持人梁继璋曾…
  3. pythonocc进阶学习:曲线拟合(插值 Interpolation/逼近 Approximation)
  4. CSS进阶(5)—— 深入理解margin
  5. 高项_第十四章信息文档管理与配置管理
  6. CANopen中SDO、PDO、以及COB-ID理解
  7. Python Eclipse+PyDec下载和安装教程(超级详细)
  8. 未能注册模块 HSIDCandRead.ocx HRESULT -2147010895
  9. Windows美化软件WindowFX简介
  10. 以jsp实现管理后台界面侧栏