vijos[1355]车队过桥问题

描述

现有N辆车要按顺序通过一个单向的小桥,由于小桥太窄,不能有两辆车并排通过。另外,由于小桥建造的时间已经很久,只能承受有限的重量,记为Max(吨)。管理员将N辆车按初始的顺序分组,每次让一个组过桥,并且只有在一个组的车辆全部过桥后,下一组车辆才能上桥。每辆车的重量和最大速度是已知的,而每组车的过桥时间由该组中速度最慢的那辆车决定。请你帮管理员编一个程序,将这N辆车分组,使得全部车辆通过小桥的时间最短。

格式

输入格式

文件的第一行有3个数字,分别为Max(吨),Len(桥的长度,单位km),N(3个数之间用一个或多个空格隔开)。接下来又N行,每行两个数,第i行的两个数分别表示第i辆车的重量w(吨)和最大速度v(km/h)。

max,len,w,v不超过32位有符号整数类型的最大值,且为整数
n<1000

输出格式

文件只有一行,即全部车辆通过小桥的最短时间(minute),精确到小数点后一位。

样例1

样例输入1

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

样例输出1

75.0

限制

1 second

题解

一道需要注意细节的动态规划题

思路是比较清晰的,细节是要注意long long和double间的转换问题先预处理数据,用t[i][j]对应车区间[i,j]的最大过桥时间,w[i]表示[1,i]车子重量的前缀和

对于每辆车的最小过桥时间是没有后效性的,因此设f[i]对应第i辆车过桥的最小时间

状态转移方程为

  f[i]=min{f[j-1]+v[j][i]}  (j∈[1,i])

#include<cstdio>
#include<iostream>
using namespace std;
const int N=1001;
int n;
double t[N][N],f[N];
unsigned long long w[N],W,L;
int main(){
    ios::sync_with_stdio(false);
    cin>>W>>L>>n;
    for(int i=1;i<=n;i++)
        cin>>w[i]>>t[i][i],
        t[i][i]=L/t[i][i],
        w[i]+=w[i-1];
    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
            t[i][j]=max(t[j][j],t[i][j-1]);
    f[1]=t[1][1];
    for(int i=2;i<=n;i++){
        f[i]=1e6;
        for(int j=i;j>=1;j--){
            if(w[i]-w[j-1]>W)
                break;
            f[i]=min(f[i],f[j-1]+t[j][i]);
        }
    }
    printf("%.1lf\n",f[n]*60.000);
    return 0;
}
时间: 2024-10-13 00:55:54

vijos[1355]车队过桥问题的相关文章

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

Vijos P1785 同学排序【模拟】

同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? 样例1 样例输入1 1989 5 样例输出1 1926 限制 1s 提示 [数据范围] 1≤n≤10 100≤m≤100000 题目链接:https://vijos.org/p/1785 分析:站出序号为偶数的人,如果总人数为奇数,剩余人数向上取整再折半就好了! 下面给出AC代码: 1 #incl

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

经典算法一 --- 过桥问题

题目: 在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时通过.如果各自单独过桥的话,四人所需要的时间分别是1,2,5,8分钟:而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间.问题是,你如何设计一个方案,让用的时间最少. 针对上篇算法题--过桥问题的解析如下 解答其实也容易,能者多劳这四个字就足以形容解答方案了--用时短的人必须要多跑几趟以便传递手

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏.那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目.现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:o 1* 2* 3* 2o 2* 2* 2 ('*'代表有雷,'o'代表无雷)由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案.

Vijos 1523 贪吃的九头龙 【树形DP】

贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted by JackDavid127 描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,

过桥问题,求最短时间

小明一家5口人在夜晚过一座桥,小明过桥要1分钟,小明的弟弟过桥要3分钟,小明的爸爸过桥要6分钟,小明的妈妈过桥要8分钟,小明的爷爷过桥要12分钟:这座桥每次只能过2个人,因是夜晚,过桥时必须提着灯,小明有一只灯,点燃后30分钟会熄灭,问怎么样安排,才能保证小明一家在灯熄灭前过桥. 写了一个PHP程序解决这类问题.有问题,欢迎指出. <?php /* 过桥问题 */ main(); function main(){ $arr=array(3,1,12,8,6); print bridge($arr

vijos P1448 校门外的树

描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同K=2,读入l,r表示询问l~r之间能见到多少种树(l,r>0) 输入格式 第一行n,m表示道路总长为n,共有m个操作接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 提示 范围:20%的数据保证,n,m<=10060%的数据保证

Vijos P1061 迎春舞会之三人组舞 DP

题目链接:https://vijos.org/p/1061 n个人选出3*m人,排成m组,每组3人. 站的队形——较矮的2个人站两侧,最高的站中间. 从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低. 计算公式为 h=(a-b)^2 (a.b为较矮的2人的身高)现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低; input: 第一排为m,n. 第二排n个数字,保证升序排列. 思路:由于和中间高的人无关,但是每次选旁边两个的时候,会由于没有比这