信息学奥赛一本通 1232:Crossing River | OpenJudge NOI 4.6 702:Crossing River
【题目链接】
ybt 1232:Crossing River
OpenJudge NOI 4.6 702:Crossing River
一本通里的翻译不够完整,OpenJudge中的英文原题中有对数据大小的限制:
样例组数1≤T≤201\le T \le 201≤T≤20,人数n≤1000n \le 1000n≤1000,每个人过河时间s≤100s \le 100s≤100
【题目考点】
1. 贪心
小船过河问题
同样问题可以参考:CSPJ2021初赛 第15题
【解题思路】
1. 思路
经典小船过河问题
考虑每次将2个人渡到对岸,有两种方案:
假设参与渡河的4人a、b、c、d的渡河时间分别为:ta,tb,tc,tdt_a,t_b,t_c,t_dta,tb,tc,td且有ta≤tb≤tc≤tdt_a\le t_b \le t_c \le t_dta≤tb≤tc≤td,要将c与d渡到对岸。
方案1:a作为船夫
渡河流程为:a与c到对岸,a回来,a与d到对岸,a回来。
渡河时间为渡河的二人中渡河时间较长的时间,所以该方案的渡河时间为:2ta+tc+td2t_a+t_c+t_d2ta+tc+td。
显然在该方案下,tat_ata越小渡河时间越短。所以a应该为渡河时间最短的人。
方案2:a与b作为船夫
渡河流程为:a与b到对岸,a回来,c与d到对岸,b回来。
该方案的渡河时间为:2tb+ta+td2t_b+t_a+t_d2tb+ta+td
显然在该方案下,tat_ata与tbt_btb应该尽可能小,而tct_ctc应该尽量接近tdt_dtd。
其他将两个人渡到对岸的方案,都不如上述两种方案。这里不再做详细论证。
而上述两种方案的优劣是不固定的,所以需要每次判断哪种方案的渡河时间更短。
2. 具体做法
将渡河时间升序排序,选择渡河时间最短的两个人作为船夫a与b,每次选择渡河时间最长的两个人作为c与d进行渡河。比较两种渡河方案,看哪种方案渡河时间更短,选择渡河时间更短的渡河方案。
重复上述过程,每次渡过去两个人,直到剩余人数小于4。
如果剩下3人,按渡河时间从小到大分别为a,b,c,那么最佳的渡河方案为:a与c到对岸,a回来,a与b到对岸,渡河时间为:ta+tb+tct_a+t_b+t_cta+tb+tc。
如果剩下2人,则a,b两人可以直接渡到对岸,渡河时间为tbt_btb。
如果剩下1人(【注意】如果一共只有1个人,就会出现这种情况。),那么渡河时间为tat_ata。
统计渡河总时间,输出。
【题解代码】
解法1:贪心
#include <bits/stdc++.h>
using namespace std;
#define N 1005
int main()
{int n, m, t[N];cin >> m;while(m--){int sum = 0; int i;cin >> n;for(i = 1; i <= n; ++i)cin >> t[i];sort(t+1,t+1+n);for(i = n; i >= 4; i-=2)sum += min(2*t[1]+t[i]+t[i-1], t[1]+2*t[2]+t[i]);if(i == 3)sum += t[1]+t[2]+t[3];else if(i == 2)sum += t[2];else//i == 1 如果只有一个人,那么就会出现这种情况 sum += t[1];cout << sum << endl;}return 0;
}
信息学奥赛一本通 1232:Crossing River | OpenJudge NOI 4.6 702:Crossing River相关推荐
- 信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶
[题目链接] ybt 1190:上台阶 OpenJudge NOI 2.3 3525:上台阶 注:ybt 1190最大数据数量为71,而OpenJudge 2.3 3525中最大数据数量为100.如果 ...
- 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛
[题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...
- 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题
[题目链接] ybt 1226:装箱问题 OpenJudge NOI 4.6 19:装箱问题 [题目考点] 1. 贪心 [解题思路] 该题说是三维立方体,实际上无论是包裹还是产品,高度都是h,因而不用 ...
- 信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818
[题目链接] ybt 1216:红与黑 OpenJudge NOI 2.5 1818:红与黑 [题目考点] 1. 连通块问题 2. 深搜/广搜 [解题思路] 1. 深搜 从第一个格子出发,遍历所有可以 ...
- 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09
[题目链接] ybt 1115:直方图 OpenJudge NOI 1.9 09:直方图 [题目考点] 1. 散列存储 也叫哈希存储.其思想为:将要存储的值通过某种算法映射到存储地址,映射算法为散列函 ...
- 信息学奥赛一本通 1114:白细胞计数 | OpenJudge NOI 1.9 08
[题目链接] ybt 1114:白细胞计数 OpenJudge NOI 1.9 08:白细胞计数 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变量mx,mx的初 ...
- 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯
[题目链接] ybt 1109:开关灯 OpenJudge NOI 1.5 31:开关灯 [题目考点] 1. 模拟 2. 循环.数组 3. 用逗号分隔输出 设标志位:isFirst,表示现在输出的是否 ...
- 信息学奥赛一本通 1073:救援 | OpenJudge NOI 1.5 19:救援
[题目链接] ybt 1073:救援 OpenJudge NOI 1.5 19:救援 [题目考点] 1. 直角坐标系下某点到原点的距离 点(x,y)(x,y)(x,y)到原点的距离d=x2+y2d = ...
- 信息学奥赛一本通 1070:人口增长 | OpenJudge NOI 1.5 14:人口增长问题
[题目链接] ybt 1070:人口增长 OpenJudge NOI 1.5 14:人口增长问题 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a, ...
最新文章
- VCSA 6.5 HA配置 之三 :准备工作
- 安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法
- ubuntu上面安装nodejs,npm,bower,grunt,yeoman
- wxWidgets:拖放样本
- 分叉并加入Java 7 – JSR 166并发实用程序
- Airflow安装与使用
- mybatis学习(40):逆向工程的创建
- mysql workbench 存储过程_MySQL Workbench创建存储过程教程示例
- 将Matting结果转化为二分割结果
- 查找文件夹下图片的数量
- 9.企业安全建设入门(基于开源软件打造企业网络安全) --- SOC系统建设
- 基于HT for Web的3D树的实现
- 嵌入式中的 C 语言
- python实现isprime函数_Python语言的isPrime函数
- 天刀手游不显示服务器列表,天涯明月刀手游服务器bug解决方法
- 颜色代码:网页颜色代码大全及色彩搭配教程
- kindle中html笔记,Kindle教程:如何导出笔记
- 打印机连接技术概述(LPRRAWAppleTalk)
- linux如何查看x windows,X windows
- 芯片和集成电路的区别和联系
热门文章
- ListView setOnItemClickListener无效
- curl和file_get_contents 区别以及各自的优劣
- [转载]Programming MS Office 2000 Web Components第二章第三节
- 本地项目上传到gitlab上
- Nginx的这些妙用,你肯定有不知道的!
- 腾讯再发股票吸引人才,受益2.57万名员工,人均超8万港元
- 瓜田老梁:FA1# 微服务流控防护场景与应对措施
- 内涵!!!程序猿才懂的动图...
- 自动化集成:Pipeline整合Docker容器
- DnCNN论文阅读笔记【MATLAB】