【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104606
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

 【问题描述】

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

 

【输入文件】

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

 

【输出文件】

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

 

【输入输出样例】

输入:

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


【参考程序】:
#include<string.h>
#include
<stdlib.h>
#include
<stdio.h>
double f[1001];
int w[1001],s[1001];
int mw,ml,n;
int main()
{
        freopen(
"convoy.in","r",stdin);
        freopen(
"convoy.out","w",stdout);
        scanf(
"%d%d%d",&mw,&ml,&n);
        
for (int i=1;i<=n;i++)
        {
                scanf(
"%d%d",&w[i],&s[i]);
                f[i]
=0xFFFFFFF;
        }
        f[
0]=0.0;
        
long long temp,lest;
        
for (int i=1;i<=n;i++)
        {
                temp
=w[i];lest=s[i];
                f[i]
=f[i-1]+(ml*1.0)/lest;
                
for (int j=i-1;j>=0;j--)
                {
                        
if (temp>mw) break;
                        
if (f[i]>f[j]+(ml*1.0)/lest)
                                f[i]
=f[j]+(ml*1.0)/lest;
                        temp
+=w[j];
                        
if (lest>s[j]) lest=s[j];
                }
        }
        printf(
"%0.1lf\n",f[n]*60.0);
        
return 0;
}
posted on 2009-04-14 19:20 开拓者 阅读(1113) 评论(2)  编辑 收藏 引用 所属分类: 动态规划&背包经典习题

Feedback

# re: 【护卫队(Convoy)】 2013-06-23 21:24 zm
护卫队过桥问题,可以解释详细一点吗?  回复  更多评论
  

# re: 【护卫队(Convoy)】 2013-06-23 21:37 zm
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
double f[1001];
int w[1001],s[1001];
int mw,ml,n;
int main()
{
freopen("convoy.in","r",stdin);
freopen("convoy.out","w",stdout);
scanf("%d%d%d",&mw,&ml,&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&s[i]);
f[i]=0xFFFFFFF;
}
f[0]=0.0;
long long temp,lest;
for (int i=1;i<=n;i++)
{
temp=w[i];lest=s[i];
f[i]=f[i-1]+(ml*1.0)/lest;
for (int j=i-1;j>=0;j--)
{
if (temp>mw) break;
if (f[i]>f[j]+(ml*1.0)/lest)
f[i]=f[j]+(ml*1.0)/lest;
temp+=w[j];
if (lest>s[j]) lest=s[j];
}
}
printf("%0.1lf\n",f[n]*60.0);
return 0;
}
可以加点注释吗?  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理