打卡信奥刷题(1046)用C++实现信奥 P1594 护卫队

P1594 护卫队

题目描述

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

输入格式

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

输出格式

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

输入输出样例 #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

C++实现

#include
#include
using namespace std;
long long Wb,Sb,n,w[1000],v[1000],W[1000];double T[1000],t[1000][1000],f[1000];

int main(){
cin>>Wb>>Sb>>n;
for(int i=1;i<=n;i++) {
cin>>w[i]>>v[i];
T[i]=(double)Sb/v[i]*60;
t[i][i]=T[i];
}
for(int i=1;i<=n-1;i++) {
for(int j=i+1;j<=n;j++) {
t[i][j]=max(t[i][j-1],T[j]);
}
}
for(int i=1;i<=n;i++) {
W[i]=W[i-1]+w[i];
}
for(int i=1;i<=n;i++) {
f[i]=T[i]+f[i-1];
for(int j=i-1;j>=1;j–) {
if (W[i]-W[j-1]<=Wb) {
f[i]=min(f[i],f[j-1]+t[j][i]);
}
else break; //不能组成车队
}
}
printf(“%0.1lf”,f[n]);
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值