ny47 过河问题
过河问题
- 描述
-
在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。
输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
- 输出
- 输出所有人都过河需要用的最少时间
- 样例输入
-
1
4
1 2 5 10 - 样例输出
-
17
讲解本题:这是一种简单的动态规划问题,思考的时候比较复杂,不太容易理解,大致意思是当两个人过去后,有一个人还要回来(把灯送回来,但是送灯回来的时间也要加上),由此考虑求解; 现在假设n个人的过河时间已经从小到大排好序用数列 a1 ,a2 ,a3 ,a4 ,... , an ; 当(n =1) time= a[n] ;
当(n >=2) 时:假如n=4时; (1)
a3 ,a4 怎么过,
肯定是a1 , a2 先过去再a1回来。 然后第一种方法(a)a1和a3 一起过,再a1回来和a4一起过 。 总时间 time1 = a1 + a3 + a1 + a4 ; 第二种方法(b)a3和a4一起过再a2回来和a1一起过。 总时间 time2 =a1 + a4 + a2 + a2 ; time = min(time1 , time2);取最短的方法;
实质上就是这个判断句if(2*a[2] < a[1]+a[i-1]) 例如第一步 a1,a2,先过,时间a2,a1回来,时间a1
第二步,a3,a4,过,时间a4,a2,回来,时间a2, 或者 a1,a4,先过,时间a4,然后,a1回来,时间a1
第三步,a2,a1,过,时间a2, 或者 a1,a3,过,时间a3,,
第一种 a2+a1+a4+a2+a2 第二种 a2+a4+a1+a1+a3
比较两种差别在a2+a2 a1+a3(a3其实就是i-1)
所以解决了这个,问题就解决了,当然当为三个人时,方法固定,先一和三,然后一回去,再加上二就行了;具体代码如下:#include<stdio.h>
#define MAX 1000
int main()
{
int n_sample, n_person, a[MAX], total_time, i, j, t;
scanf("%d",&n_sample); //样例数量
while(n_sample--)
{
scanf("%d",&n_person); //输入人数
for(i = ; i <= n_person; ++i)
scanf("%d",&a[i]); //输入每个人的过河时间,空格分开,开始下标用1
total_time = ; if(n_person != )//选择法进行排序
{
for(i = ; i <= n_person - ; i++)
for(j = i+; j <= n_person; ++j)
if(a[j] < a[i])
{t = a[j];a[j] = a[i];a[i] = t;} for(i = n_person; i >= ;)
{
if(i == ) //如果是3个人
{
total_time += a[]+a[];
break;
}
if( *a[] < a[]+a[i-])
{
total_time += a[] + *a[] + a[i];
i-= ;
}
else
{
total_time += a[i] + a[];
i--;
}
}
total_time += a[];
}
else
total_time = a[]; //如果只有一个人
printf("%d\n",total_time);
}
return ;
}
ny47 过河问题的更多相关文章
- [LeetCode] Frog Jump 青蛙过河
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- [codevs1105][COJ0183][NOIP2005]过河
[codevs1105][COJ0183][NOIP2005]过河 试题描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青 ...
- A*算法 -- 八数码问题和传教士过河问题的代码实现
前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...
- 袋鼠过河---DP
题目:一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远,每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5, ...
- NOIP2005过河[DP 状态压缩]
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- ACM 过河问题
过河问题 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的 ...
- NOIP 2005 青蛙过河
做题记录:2016-08-10 21:58:09 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都 ...
- 过河问题nyoj47
时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是 ...
- 商人过河问题(DFS)
问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人.在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过 ...
随机推荐
- 算法笔记_186:历届试题 高僧斗法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地 ...
- jquery position方法使用及兼容性
1.position方法 jquery api地址:http://jquery.cuishifeng.cn/position.html position方法获取匹配元素相对父元素的偏移. 2.说明 2 ...
- 手动脱NsPacK壳实战
作者:Fly2015 这里脱壳的程序是吾爱破解培训的作业2,相较于作业1略微要强一点,可是仅仅要掌握了脱壳的ESP定律,脱这个Nspack壳并不难.只是还是蛮有意思的. 1.使用查壳软件对加壳的程序进 ...
- 【BIEE】超过了已配置的最大允许输入记录数
声明:BIEE版本为Oracle Business Intelligence 11.1.1.7.160719 BIEE打开报表报错如下: 如果你是英文版的错误如下: "View Displa ...
- 关于html中的doctype的重要性的认知以及IE的浏览器模式与文档模式
浏览器模式”用于切换IE针对该网页的默认文档模式.对不同版本浏览器的条件备注解析.发送给网站服务器的用户代理(User-Agent)字符串的值.网站可以根据浏览器返回的不同用户代理字符串判断浏览器的版 ...
- 机器学习的敲门砖:手把手教你TensorFlow初级入门
摘要: 在开始使用机器学习算法之前,我们应该首先熟悉如何使用它们. 而本文就是通过对TensorFlow的一些基本特点的介绍,让你了解它是机器学习类库中的一个不错的选择. 本文由北邮@爱可可-爱生活 ...
- eclipse里面的时间错误,比电脑系统时间慢了8个小时
eclipse里面的时间错误,比电脑系统时间慢了8个小时 解决办法: 打开<eclipse安装目录>/eclipse.ini文件 在文件末尾追加 -Duser.timezone=Asia/ ...
- PHP实现以UTF8格式截取指定字符串位数
PHP代码: /* UTF8格式截取字符串,并且指定截取位数 */ function cut_string($string="",$num=20){ if(mb_strlen($s ...
- 中国城市线划分—Where do you want to develop......
- 基于docker的centos:latest镜像制作nginx的镜像
Dockerfile和nginx.repo在同一目录下 先创建nginx.repo [root@localhost nginx]# cat nginx.repo [nginx] name=nginx ...