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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容