题干:

题目大意:

有N个人要过桥,每个人速度不同,只有一个手电筒,每次最多只能过去两个人,问所有人最短的过桥时间为多少

解题报告:

首先让最快的两个人最后过,然后我们分奇偶考虑,分别处理到剩下三个人和两个人的情况。然后在做最后的处理。

除了最后的处理(其实是最先执行的步骤),我们看其他的步骤,现在最快的俩人都在对岸。

现在两种贪心策略:(一个回合就处理两个人,每个回合把当前速度最慢的两个人带到河岸)

1.最快速度的人每次带一个当前速度最慢的人过去,自己返回;再带一个当前速度最慢的人过去, 再返回(也就是这俩最慢的都让最快的带回来)

2.最快速度的人和速度第二快的人一起过去;最快速的人返回,速度最慢的两个人一起过去;速度第二快的人返回。

对于每一个回合,我们去这两种策略中的较小值,,贪心即可得到答案。

AC代码:

//该死的格式错误怎么不提示PE了??怎么成WA了????
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int a[MAX];
int main()
{int t,n;cin>>t;while(t--) {int ans = 0;scanf("%d",&n);for(int i = 1; i<=n; i++) scanf("%d",a+i);sort(a+1,a+n+1);if(n == 1) {printf("%d\n%d\n",a[1],a[1]);if(t) puts("");continue;}if(n == 2) {printf("%d\n%d %d\n",a[2],a[1],a[2]);if(t) puts("");continue;}int res,time=0;if(n%2==1) res=3;else res=2;for(int i = n; i>res; i-=2) {ans += a[1]+a[i];//先跑过去 if(a[2]*2<a[i-1]+a[1]) ans += a[2] + a[2];else ans += a[i-1]+a[1];}if(n%2 == 1) ans += a[1]+a[2]+a[3];else ans += a[2];printf("%d\n",ans);if(n == 3) {printf("%d %d\n%d\n",a[1],a[2],a[1]);printf("%d %d\n",a[1],a[3]);if(t) puts("");continue;}for(int i = n; i>res; i-=2) {if(a[2]*2 < a[i-1]+a[1]) {printf("%d %d\n%d\n", a[1], a[2], a[1]);printf("%d %d\n%d\n", a[i-1], a[i], a[2]);}else {printf("%d %d\n%d\n", a[1], a[i-1], a[1]);printf("%d %d\n%d\n", a[1], a[i], a[1]);}}if(n%2==1) {printf("%d %d\n%d\n", a[1], a[2], a[1]);printf("%d %d\n", a[1], a[3]);}else printf("%d %d\n",a[1],a[2]);if(t) puts("");} return 0 ;}

就像学长说的,这题重要的是这个贪心的思路,可以构造出很多不同的题型:比如学长讲课时说的,可以和置换群建立起关系。比如构造一个题:

给你n个数(数值保证从1~n 且互不相同),先定义一种操作:可以任选两个元素进行交换,交换的代价是这两个元素值的和。现在问你如果我要吧这个序列变成一个有序序列,最小的代价是多少。

首先我们知道,我们要找一些轮换,然后这一些轮换对调就可以了,根据置换群的知识,我们知道可以把这些对调换成一个个的对换去完成,并且如果这一个轮换涉及k个元素的话,我们需要对换k-1次,那么既然次数确定,并且需要有一个作为每次都出现的(详情见离散数学),那我们就贪心那个最小的作为每一次对换都出现的元素,,这一点并不难想。。但是有没有可能有更优的选择?比如我们(100,102,104,103,105,106,107,108)这有八个元素组成一个轮换的话(顺序是我瞎写的)那我们肯定选100当那个每次都出现在对换中的元素,,但是我们想,有没有可能把另外一个最小的元素换过来当成最小的元素,换完了以后再换回去呢?比如还有一个轮换(1,2,3),那么我们先1和100对调,然后再用1去做那7次对换,然后再把1和100调回去,这样代价肯定小了很多啊、、这里仅提供思路,,具体题目遇到再说、

【UVA - 10037】Bridge(过河问题,经典贪心)相关推荐

  1. 过河问题(经典贪心)

    题目描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过 ...

  2. uva 10037——Bridge

    题意:有一个桥,每次只能两个人拿着手电筒通过然后一个人拿着电筒回来,然后让新人过去,给出每个人的过桥时间,问最后总的最小时间. 思路:贪心.1个人2个人好考虑,排好序,三个人是13,1,12,大于3个 ...

  3. UVA 11134 - Fabled Rooks(经典贪心)

    题目链接 https://cn.vjudge.net/problem/UVA-11134 [题意] 你的任务是在n×n的棋盘上放置n辆车,使得任意两辆车不互相攻击,且第i辆车在一个给定的矩形Ri以内. ...

  4. 过河问题(贪心算法)(python)

    过河问题(贪心算法) - CapitalAccumulation - 博客园 思路非常清晰 过河问题 一.问题描述 二.问题答案 三.扩展 四.问题推广 五.对于本题的最优选择: coding 一.问 ...

  5. 【经典贪心练习】金银岛

    [贪心练习]金银岛 哈喽,大家好,我是赏月君,今天做一下经典贪心算法的题目--金银岛,废话少说,上题目. 题目描述 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝 ...

  6. leetcode:55. 跳跃游戏【经典贪心】

    分析 维护当前走到的位置,以及当前能走的最大区间内下一次走到的最远位置maxPos 当前能走的位置就是[cur, maxPos]但是在走的过程中,边走边看下一次的maxPos,然后当cur走到上一个m ...

  7. POJ 1700 经典过河问题(贪心)

    POJ题目链接:http://poj.org/problem?id=1700 N个人过河,船每次最多只能坐两个人,船载每个人过河的所需时间不同,问最快的过河时间. 思路: 当时所需要的最小时间很容易求 ...

  8. P1031 均分纸牌(经典贪心)

    题目描述 有N堆纸牌,编号分别为1,2,-,N.每堆上有若干张,但纸牌总数必为N的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上:在编号为N的 ...

  9. 【UVA - 11729】Commando War (贪心,时间调度问题)

    题干:(Uva不放题干了) 题目大意:(实在是自己懒得写网上找了一个) 解题报告: 调度问题,直接贪心出完成任务需要的时间最长的那个人排序,就行了. 方法正确性的证明以前也写过了,,这里就不再写了,, ...

最新文章

  1. tomcat启动停在Initializing Spring root WebApplicationContext
  2. Know more about CBO Index Cost
  3. anaconda的python使用教程-致Python初学者们 - Anaconda入门使用指南
  4. Linux EXT3文件系统下成功恢复误删的文件
  5. proteus三输入与非门名字_Proteus仿真库元件名大全
  6. 跟益达学Solr5之solrconfig.xml配置详解
  7. Android | Sqlite3
  8. Unity3D笔记 愤怒的小鸟五 小鸟动画+Unity3D如何设置断点调式
  9. 安川西格玛7驱动器手册_安川伺服驱动说明书7.pdf
  10. 《批判性思维工具》—— 阅读内化(5)
  11. 罗马音平假名中文可复制_200个中文常见姓氏的日语发音,再也不愁起日文名字啦!...
  12. 日本官方版灌篮高手结局
  13. VS2010 移除源文件又增加源文件,无法编译问题
  14. 校园火灾项目结合Focus
  15. 手把手带二大爷用EasyDL实现戴口罩检测APP
  16. 高3老师给大一学生的一封信
  17. 女生最想泡的12种男生!(男生必看)
  18. 两全险的主险是什么意思?
  19. 单条视频播放量破2000w,一首《孤勇者》就能盘活一个账号?
  20. HTML CSS JS 特殊字符编码表

热门文章

  1. 使用js实现换肤功能
  2. [Leedcode][JAVA][第11题][盛最多水的容器][双指针][贪心]
  3. 2017蓝桥杯决赛-发现环 数据结构|搜索
  4. POJ 2299 - Ultra-QuickSort BIT
  5. c语言程序改错例题,C语言程序改错习题
  6. python 在gui中显示logging_如何在GUI中显示print()的输出python
  7. linux tcp header更改,Linux Netfilter中修改TCP/UDP Payload的方法
  8. linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)
  9. pythom打包文件太大_从SQL注入到整站打包与本地搭建
  10. find_path、find_library备忘录