一道编程题,求解。

buaaxzl 2012-02-26 08:50:32
潜水接力
时间限制:1000 ms | 内存限制:65536 KB
描述



北航软件学院2年级的N名同学准备挑战学校潜水接力赛的记录。比赛需要选手从游泳池的起点潜水到终点,这是一个团体项目,一个团队由N个人组成(N是小于1,000的正整数),在潜水时必须使用氧气瓶,但是只有一个氧气瓶。最多两人可同时使用一个氧气瓶,但此时两人必须同步潜水,因此两人到达终点的时间等于较慢的一个人单独潜水到终点所需的时间。某组合(一人或两人)潜到终点后,若起点还有队员,则需要有人从终点再潜回起点,以帮助起点的队员潜到终点,直到所有人都潜到终点。软件学院的同学参加这次比赛,大家都很友好,任何两人都愿意一起潜水。对任何人,若已知他从起点到终点的潜水时间(终点到起点也相同),请设计一种潜水接力策略,使该团队潜水的总时间最短。

输入



第一行为一个整数T,表示有T组测试数据。


对于每组测试数据,第一行是正整数N (小于1,000),表示有N名同学;第二行是N个正整数m(1<=m<=100),每个数表示某个同学的潜水时间,每个数用空格分开。

输出



对于每组测试数据,输出一行,表示该团队的潜水的最短总时间。

样例输入
1
4
1 2 3 5
样例输出
12
...全文
334 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
孑虫 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 backspaceyao 的回复:]

关于这题,代码我不想敲了,给你说说思路吧,首先考虑N=2:这个时候只有一种情况,两人同时过河;
在考虑N=3:此时有最快的一人往返将其余两人带过去;
其次考虑N>=4:设A,B是走的最快和次快的,时间分别为a,b;而Z,Y为走的最慢和次慢的,时间为z,y;那么
1.当2b>=a+y时,使用模式一(模式一:A,Z先过,A返回,再A,Y过,A返回,即总是最快把两个慢的带过去)
2.当……
[/Quote]
牛啊牛啊牛。这个自己想的话,得累死了。对算法是真没思路。
buaaxzl 2012-03-02
  • 打赏
  • 举报
回复
怎么没人理啊
cjwzfz 2012-02-28
  • 打赏
  • 举报
回复
这个问题太长了
buaaxzl 2012-02-28
  • 打赏
  • 举报
回复
有没有人看看啊
nanjingnew4 2012-02-27
  • 打赏
  • 举报
回复
内存限制怎么用?
程序员小迷 2012-02-27
  • 打赏
  • 举报
回复


unsigned getShortestSwimTime(int arr[], int count)
{
unsigned sum = arr[0];
int shortest = arr[0];

for(int i = 1; i < count; ++i)
{
sum += arr[i];
if(arr[i] < shortest)
shortest = arr[i];
}

return (sum + (count - 3) * shortest);
}

测试代码:
int main()
{
int arr[] = {1, 2, 3, 5};
std::cout << getShortestSwimTime(arr, 4) << std::endl;
return 0;
}



buaaxzl 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 backspaceyao 的回复:]
关于这题,代码我不想敲了,给你说说思路吧,首先考虑N=2:这个时候只有一种情况,两人同时过河;
在考虑N=3:此时有最快的一人往返将其余两人带过去;
其次考虑N>=4:设A,B是走的最快和次快的,时间分别为a,b;而Z,Y为走的最慢和次慢的,时间为z,y;那么
1.当2b>=a+y时,使用模式一(模式一:A,Z先过,A返回,再A,Y过,A返回,即总是最快把两个慢的带过去)
2.当2b<……
[/Quote]
你这是总以两个最慢的为阶段,考虑把他们带到终点的代价,选择两种可能的最小值累加。
那有没有一种可能是,最快的先把最慢的带过去,然后两个最慢的一起过去。即以最慢的三个为考虑对象。
在这点上没弄明白,望指教。
backspaceyao 2012-02-27
  • 打赏
  • 举报
回复
关于这题,代码我不想敲了,给你说说思路吧,首先考虑N=2:这个时候只有一种情况,两人同时过河;
在考虑N=3:此时有最快的一人往返将其余两人带过去;
其次考虑N>=4:设A,B是走的最快和次快的,时间分别为a,b;而Z,Y为走的最慢和次慢的,时间为z,y;那么
1.当2b>=a+y时,使用模式一(模式一:A,Z先过,A返回,再A,Y过,A返回,即总是最快把两个慢的带过去)
2.当2b<a+y时,使用模式二(模式二:A,B过去,A回来送氧气瓶,再Z,Y过,B回来,即两个快的先过,再两个慢的过)
用这两种模式递归解题就行了
buaaxzl 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cxsjabcabc 的回复:]

C/C++ code


unsigned getShortestSwimTime(int arr[], int count)
{
unsigned sum = arr[0];
int shortest = arr[0];

for(int i = 1; i < count; ++i)
{
sum += arr[i];
i……
[/Quote]
你的意思是始终用时间最短的人来回送氧气瓶吗? 这样似乎不能总能得到最优解。 也要考虑时间第一短的人和第二短的人先过去,留下一个人在对岸,一个人过去送氧气瓶,然后时间第一长的人和时间第二长的人一起,这样同样可以节省好多时间。
wgggkgd 2012-02-27
  • 打赏
  • 举报
回复

//p为升序排列的数组
int fun(int* p,int count)
{
if (count == 2)
{
return p[1];
}
else if (count == 3)
{
return p[0] + p[2] + fun(p,2);
}
else
{
return p[0] + 2 * p[1] + p[count - 1] + fun(p,count - 2);
}
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧