过桥问题

article/2025/9/11 21:31:16

在一个夜黑风高的晚上,有n(n <= 50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是多少。
分析:

每次过桥的时候最多两个人,如果桥这边还有人,那么还得回来一个人(送手电筒),也就是说N个人过桥的次数为2*N-3。有一个人需要来回跑,将手电筒送回来(也许不是同一个人,realy?!)这个回来的时间是没办法省去的,并且回来的次数也是确定的,为N-2,如果是我,我会选择让跑的最快的人来干这件事情,但是我错了…如果总是跑得最快的人跑回来的话,那么他在每次别人过桥的时候一定得跟过去,于是就变成就是很简单的问题了,花费的总时间:

T = minPTime * (N-2) + (totalSum-minPTime)

来看一组数据 四个人过桥花费的时间分别为 1 2 5 10,按照上面的公式答案是19,但是实际答案应该是17。

具体步骤是这样的:

第一步:1和2过去,花费时间2,然后1回来(花费时间1);

第二歩:3和4过去,花费时间10,然后2回来(花费时间2);

第三部:1和2过去,花费时间2,总耗时17。

所以之前的贪心想法是不对的。我们先将所有人按花费时间递增进行排序,然后第一次过河的总是耗时最短的两位,假设前i个人过河花费的最少时间为opt[i]。

一.假设前i-1个人已经过河,即河这边还剩1个人,并且手电筒肯定在对岸,所以opt[i] = opt[i-1] + a[1] + a[i] (让花费时间最少的人把手电筒送过来,然后和第i个人一起过河)

二.假设前i-2个人已经过河,则河这边还剩2个人,即第i个和另外一个,并且手电筒肯定在对岸,所以opt[i] = opt[i-2] + a[1] + a[i] + 2*a[2] (让花费时间最少的人把电筒送过来,然后第i个人和另外一个人一起过河,由于花费时间最少的人在这边,所以下一次送手电筒过来的一定是花费次少的,送过来后花费最少的和花费次少的一起过河,解决问题)
所以:

opt[i] = min{opt[i-1] + a[1] + a[i] , opt[i-2] + a[1] + a[i] + 2*a[2] }

递归实现:

time elased1.09829
class Solution {
public:int shortesttime(vector<int> vec) {if(vec.empty())return 0;if(vec.size()==1)return vec[0];sort(vec.begin(),vec.end());if(vec.size()==2)return vec[1];int tmp1=vec[vec.size()-1];vec.pop_back();int res1=shortesttime(vec);vec.pop_back();int res2=shortesttime(vec);return min(res1+vec[0]+tmp1,res2+vec[0]+tmp1+2*vec[1]);}
};
int main()
{Solution A;vector<int> vec(30);int i=1;for(auto &v:vec){v=i;i++;}boost::timer time;int result=A.shortesttime(vec);cout<<"time elased"<<time.elapsed()<<endl;cout<<result<<endl;return 0;
}

自底向上的动态规划:

time elapsed2.1e-05
class Solution {
public:vector<int> shortesttime(vector<int> vec) {boost::timer time;if(vec.empty())return {};sort(vec.begin(),vec.end());vector<int> r(vec.size());for(int i=0;i<vec.size();i++){if(i<=1)r[i]=vec[i];elser[i]=min(r[i-1]+vec[0]+vec[i],r[i-2]+vec[0]+vec[i]+2*vec[1]);}cout<<"time elapsed"<<time.elapsed()<<endl;return r;}
};

 


http://chatgpt.dhexx.cn/article/o4xrxbvy.shtml

相关文章

过桥问题的通解

问题一,一个典型过桥问题: 小明一家5口人在夜晚过一座桥,小明过桥要1分钟,小明的弟弟过桥要3分钟,小明的爸爸过桥要6分钟,小明的妈妈过桥要8分钟,小明的爷爷过桥要12分钟;这座桥每次只能过2个人,因是夜晚,过桥时必须提着灯,小明有一只灯,点燃后30分钟会熄灭,问怎…

如何打开tdms文件?

https://www.zhihu.com/question/305029962/answer/1203851780v 下载地址 http://www.ni.com/example/27944/en/ 还有一个综述&#xff0c;写的挺好&#xff01; https://wenku.baidu.com/view/c62700e4aa00b52acec7ca09.html

转载:TDM协议

转自http://www.wangdali.net/i2s/ 1. PCM简介 PCM (Pulse Code Modulation) 是通过等时间隔(即采样率时钟周期)采样将模拟信号数字化的方法。图11为4 bit 采样深度的PCM数据量化示意图。 图11. 4-bit PCM的采样量化 PCM数字音频接口,即说明接口上传输的音频数据通过PCM…

02 - DDMS

目录 一. DDMS 是什么&#xff1f; 二. 工作原理 三. ddmlib 1.ddmlib简介 总结 一. DDMS 是什么&#xff1f; DDMS 的全称是DalvikDebug Monitor Service&#xff0c;是 Android 开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信…

LabVIEW将现有数据文件映射至TDMS数据文件格式

LabVIEW将现有数据文件映射至TDMS数据文件格式 在某些情况下&#xff0c;可能无法使用TDMS文件格式&#xff0c;例如客户或供应商指定必须使用某种格式存储数据。有些传统仪器可能会自动使用某种自定义格式提供数据输出文件。此外&#xff0c;已经用某种方式收集的传统测量数据…

Matlab打开LabVIEW的tdm/tdms文件

1. 下去NI官网下载 MATLAB TDM Example文件 。 网址&#xff1a;Reading TDM/TDMS Files with The MathWorks, Inc. MATLAB Software - NI Community 这里我两个文件都下载了&#xff0c;但是只打开了2020那个&#xff0c;能用我就没看sp2010那个是干嘛的。 2. 使用Matlab打…

Labview-关于TDMS文件逻辑的学习-从今天开始学习Labview

1. TDMS文件的逻辑格式 TDMS文件的逻辑格式遵循TDM三层结构&#xff0c;仍然是文件、通道组、通道三层。用户在使用时只需要关心这三层就行了。2. TDMS文件API TDMS文件格式基本上可以称为NI用在测试测量领域的通用数据文件格式&#xff0c;LabVIEW, CVI/LabWindows, Signal Ex…

[Matlab科学计算] Matlab打开Labview保存的TDMS文件

1. TDMS文件简单介绍 TDMS文件格式由三个层次结构级别组成&#xff1a;文件、组、通道。文件级别可包含任意数量的组&#xff0c;而每个组又可包含任意数量的通道。通过通道分组&#xff0c;用户可以选择如何组织数据以使其更易于理解。每​个​TDMS​文件​都​包含​两​种​…

JAVA解析TDMS文件

2023年更新&#xff1a; 没想到还有人关注&#xff0c;上传了最新代码 https://github.com/yc97/TDMSDecoder 该代码经过测试&#xff0c;基本没什么bug了 reference: http://www.eefocus.com/Junking/blog/12-07/281264_7bf69.html http://www.ni.com/white-paper/14252/zh…

LabVIEW写入可快速加载的TDMS文件

LabVIEW写入可快速加载的TDMS文件 TDMS文件格式的设计目的是在尽可能快地读写数据的同时仍保持足够的灵活性来适应采集过程中通道数量和采样率的变化。 但是数据读写速度快的文件未必可快速加载。 TDMS文件是一个完全的二进制文件&#xff0c;由多个部分数据段组成&#xff0c;…

LabVIEW TDMS连续写入内存增长

LabVIEW TDMS连续写入内存增长 每次执行TDMS写入VI时&#xff0c;内存&#xff08;RAM&#xff09;使用量都会略有增加。这是内存泄漏吗&#xff0c;如何防止内存使用量增加&#xff1f; 解答 此问题有几种可能的解决方案&#xff1a; TDMS文件的引用可能没有适当地关闭。对…

Matlab查看tdms文件

由于最近项目需要使用Labview开发解调设备&#xff0c;对于高速采集卡就需要使用tdms存储数据&#xff08;存储的数据量较大&#xff09;&#xff0c;而用matlab无法对tdms格式文件进行直接读取&#xff0c;所以查找一些相关博客&#xff0c;解决了读取的问题。&#xff08;以下…

Labview数据存储与读取——TDMS文件的创建与写入

Labview数据存储与读取——TDMS文件的创建与写入 你好&#xff0c;这是我在自学Labview编写软件过程中使用的一些功能。我在存储采集卡数据时&#xff0c;通过阅读大量他人的程序&#xff0c;发现TDM及TDMS文件十分适合波形数据的记录&#xff0c;TDMS文件比TDM文件在存储动态…

TDMS转EXCEL

NI官方有推出TDMS转EXCEL插件&#xff0c;安装后可直接用excel打开tdms文件。 下载链接&#xff1a;https://download.csdn.net/download/Kleds_Love/81168914 下载为iSO文件&#xff0c;右键→装载→管理员身份安装即可 安装完成后&#xff0c;直接双击tdms文件&#xff0c;…

计算TDMS文件的THD

1.用采集卡采集一路正弦信号&#xff0c;存为.tdms文件 2.将.tdms文件转成.csv文件或.txt文件或.xlsx文件&#xff0c;使MATLAB可以将数据导入工作空间 法1&#xff1a;将.tdms文件转成.csv文件&#xff08;依靠LabVIEW程序&#xff09; 法2&#xff1a;将.tdms文件转成.txt文件…

如何打开tdms文件

1、下载一个插件 地址&#xff1a;https://www.ni.com/example/27944/en/ 2、下载后按照导向安装即可 3、安装后如果不能打开文件&#xff0c;试试重启电脑&#xff0c;或者你电脑上没有execl软件

用Matlab处理TDMS数据(降噪+频谱分析)

目录 TDMS文件从导入到最终处理的整个过程第一&#xff1a;把TDMS文件导入到matlab用MATLAB TDMS函数使用ConventTDMS函数 第二&#xff1a;把Matlab的数据画出来附录&#xff1a;1-照着步骤依然显示不了图的解决办法附录&#xff1a;2-使用Matlab批量转换".TDMS"文件…

labview的TDMS文件读写

文章目录 一概念介绍1.相关概念2.tdms文件介绍 二.VI介绍1.TDMS打开VI2.TDMS写入3.TDMS读取4.TDMS设置属性5.TDMS获取属性6.TDMS关闭 三.范例分析——TDMS文件 并行读写的操作 写在最前面&#xff1a;本文先介绍TDMS概念和文件结构&#xff0c;然后介绍VI如何使用&#xff0c;最…

插件框架篇一之scrollbars

问题&#xff1a;部分手机&#xff08;如三星&#xff09;ListView或GridView设置scrollbars显示时会报错奔溃。 问题分析&#xff1a; ScrollView继承于View&#xff0c;在View的构造器中初始化scrollbars。 根据initializeScrollbars判断是否需要进行scrollbars初始…

VBA,窗体和控件的动态效果之一:scrollbar如何实现自动效果

问题由来&#xff1a;静态和瞬时的效果不够用&#xff0c;窗体的动态效果更难实现 之前只学习了窗体的静态效果现在考虑 窗体和控件的动态效果 1 srcollbar如何实现自动效果 给 Button 2 绑定了这样一个sub点击后&#xff0c;Scroll Bar 1 可以自动变化注意点&#xff1a;因为…