【UVA - 10037】Bridge(过河问题,经典贪心)
题干:
题目大意:
有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(过河问题,经典贪心)相关推荐
- 过河问题(经典贪心)
题目描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过.如果各自单独过 ...
- uva 10037——Bridge
题意:有一个桥,每次只能两个人拿着手电筒通过然后一个人拿着电筒回来,然后让新人过去,给出每个人的过桥时间,问最后总的最小时间. 思路:贪心.1个人2个人好考虑,排好序,三个人是13,1,12,大于3个 ...
- UVA 11134 - Fabled Rooks(经典贪心)
题目链接 https://cn.vjudge.net/problem/UVA-11134 [题意] 你的任务是在n×n的棋盘上放置n辆车,使得任意两辆车不互相攻击,且第i辆车在一个给定的矩形Ri以内. ...
- 过河问题(贪心算法)(python)
过河问题(贪心算法) - CapitalAccumulation - 博客园 思路非常清晰 过河问题 一.问题描述 二.问题答案 三.扩展 四.问题推广 五.对于本题的最优选择: coding 一.问 ...
- 【经典贪心练习】金银岛
[贪心练习]金银岛 哈喽,大家好,我是赏月君,今天做一下经典贪心算法的题目--金银岛,废话少说,上题目. 题目描述 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝 ...
- leetcode:55. 跳跃游戏【经典贪心】
分析 维护当前走到的位置,以及当前能走的最大区间内下一次走到的最远位置maxPos 当前能走的位置就是[cur, maxPos]但是在走的过程中,边走边看下一次的maxPos,然后当cur走到上一个m ...
- POJ 1700 经典过河问题(贪心)
POJ题目链接:http://poj.org/problem?id=1700 N个人过河,船每次最多只能坐两个人,船载每个人过河的所需时间不同,问最快的过河时间. 思路: 当时所需要的最小时间很容易求 ...
- P1031 均分纸牌(经典贪心)
题目描述 有N堆纸牌,编号分别为1,2,-,N.每堆上有若干张,但纸牌总数必为N的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上:在编号为N的 ...
- 【UVA - 11729】Commando War (贪心,时间调度问题)
题干:(Uva不放题干了) 题目大意:(实在是自己懒得写网上找了一个) 解题报告: 调度问题,直接贪心出完成任务需要的时间最长的那个人排序,就行了. 方法正确性的证明以前也写过了,,这里就不再写了,, ...
最新文章
- tomcat启动停在Initializing Spring root WebApplicationContext
- Know more about CBO Index Cost
- anaconda的python使用教程-致Python初学者们 - Anaconda入门使用指南
- Linux EXT3文件系统下成功恢复误删的文件
- proteus三输入与非门名字_Proteus仿真库元件名大全
- 跟益达学Solr5之solrconfig.xml配置详解
- Android | Sqlite3
- Unity3D笔记 愤怒的小鸟五 小鸟动画+Unity3D如何设置断点调式
- 安川西格玛7驱动器手册_安川伺服驱动说明书7.pdf
- 《批判性思维工具》—— 阅读内化(5)
- 罗马音平假名中文可复制_200个中文常见姓氏的日语发音,再也不愁起日文名字啦!...
- 日本官方版灌篮高手结局
- VS2010 移除源文件又增加源文件,无法编译问题
- 校园火灾项目结合Focus
- 手把手带二大爷用EasyDL实现戴口罩检测APP
- 高3老师给大一学生的一封信
- 女生最想泡的12种男生!(男生必看)
- 两全险的主险是什么意思?
- 单条视频播放量破2000w,一首《孤勇者》就能盘活一个账号?
- HTML CSS JS 特殊字符编码表
热门文章
- 使用js实现换肤功能
- [Leedcode][JAVA][第11题][盛最多水的容器][双指针][贪心]
- 2017蓝桥杯决赛-发现环 数据结构|搜索
- POJ 2299 - Ultra-QuickSort BIT
- c语言程序改错例题,C语言程序改错习题
- python 在gui中显示logging_如何在GUI中显示print()的输出python
- linux tcp header更改,Linux Netfilter中修改TCP/UDP Payload的方法
- linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)
- pythom打包文件太大_从SQL注入到整站打包与本地搭建
- find_path、find_library备忘录