【题目链接】

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相关推荐

  1. 信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶

    [题目链接] ybt 1190:上台阶 OpenJudge NOI 2.3 3525:上台阶 注:ybt 1190最大数据数量为71,而OpenJudge 2.3 3525中最大数据数量为100.如果 ...

  2. 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛

    [题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...

  3. 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题

    [题目链接] ybt 1226:装箱问题 OpenJudge NOI 4.6 19:装箱问题 [题目考点] 1. 贪心 [解题思路] 该题说是三维立方体,实际上无论是包裹还是产品,高度都是h,因而不用 ...

  4. 信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818

    [题目链接] ybt 1216:红与黑 OpenJudge NOI 2.5 1818:红与黑 [题目考点] 1. 连通块问题 2. 深搜/广搜 [解题思路] 1. 深搜 从第一个格子出发,遍历所有可以 ...

  5. 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09

    [题目链接] ybt 1115:直方图 OpenJudge NOI 1.9 09:直方图 [题目考点] 1. 散列存储 也叫哈希存储.其思想为:将要存储的值通过某种算法映射到存储地址,映射算法为散列函 ...

  6. 信息学奥赛一本通 1114:白细胞计数 | OpenJudge NOI 1.9 08

    [题目链接] ybt 1114:白细胞计数 OpenJudge NOI 1.9 08:白细胞计数 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变量mx,mx的初 ...

  7. 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯

    [题目链接] ybt 1109:开关灯 OpenJudge NOI 1.5 31:开关灯 [题目考点] 1. 模拟 2. 循环.数组 3. 用逗号分隔输出 设标志位:isFirst,表示现在输出的是否 ...

  8. 信息学奥赛一本通 1073:救援 | OpenJudge NOI 1.5 19:救援

    [题目链接] ybt 1073:救援 OpenJudge NOI 1.5 19:救援 [题目考点] 1. 直角坐标系下某点到原点的距离 点(x,y)(x,y)(x,y)到原点的距离d=x2+y2d = ...

  9. 信息学奥赛一本通 1070:人口增长 | OpenJudge NOI 1.5 14:人口增长问题

    [题目链接] ybt 1070:人口增长 OpenJudge NOI 1.5 14:人口增长问题 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a, ...

最新文章

  1. VCSA 6.5 HA配置 之三 :准备工作
  2. 安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法
  3. ubuntu上面安装nodejs,npm,bower,grunt,yeoman
  4. wxWidgets:拖放样本
  5. 分叉并加入Java 7 – JSR 166并发实用程序
  6. Airflow安装与使用
  7. mybatis学习(40):逆向工程的创建
  8. mysql workbench 存储过程_MySQL Workbench创建存储过程教程示例
  9. 将Matting结果转化为二分割结果
  10. 查找文件夹下图片的数量
  11. 9.企业安全建设入门(基于开源软件打造企业网络安全) --- SOC系统建设
  12. 基于HT for Web的3D树的实现
  13. 嵌入式中的 C 语言
  14. python实现isprime函数_Python语言的isPrime函数
  15. 天刀手游不显示服务器列表,天涯明月刀手游服务器bug解决方法
  16. 颜色代码:网页颜色代码大全及色彩搭配教程
  17. kindle中html笔记,Kindle教程:如何导出笔记
  18. 打印机连接技术概述(LPRRAWAppleTalk)
  19. linux如何查看x windows,X windows
  20. 芯片和集成电路的区别和联系

热门文章

  1. ListView setOnItemClickListener无效
  2. curl和file_get_contents 区别以及各自的优劣
  3. [转载]Programming MS Office 2000 Web Components第二章第三节
  4. 本地项目上传到gitlab上
  5. Nginx的这些妙用,你肯定有不知道的!
  6. 腾讯再发股票吸引人才,受益2.57万名员工,人均超8万港元
  7. 瓜田老梁:FA1# 微服务流控防护场景与应对措施
  8. 内涵!!!程序猿才懂的动图...
  9. 自动化集成:Pipeline整合Docker容器
  10. DnCNN论文阅读笔记【MATLAB】