UVA 10037 贪心算法
题目链接:http://acm.hust.edu.cn/vjudge/contest/122829#problem/A
题目大意:N个人夜里过河,总共只有一盏灯,每次最多过两个人,然后需要有人将灯送回
才能继续过人,每个人过桥都需要耗费一定的时间,让你求耗费的最少时间,并输出过河方案
首先,我们要明白一点,两个人过河肯定比只有一个人过河要来的划算,这样那个速度快的人
就相当于是被带过去的,然后我们从最简单的情况开始分析:(sort(a,a+n))
n=1时,直接过去就可以,t=a[0]
n=2时,两个人直接一起过去,耗时t=a[1]
n=3时,因为肯定要有人送灯回来,肯定是选择跑的最快的a[0]
所以方案是 0,1->0->0,2耗时a[0]+a[1]+a[2]
当n>=4时,我们有两种可能最优方案,
1.全都让a[0]来送,送过去以后送灯回来耗时: a[i]+a[i+1]+2*a[0]
2.0,1->0->i,i+1->1 耗时:a[i+1]+2*a[1]+a[0]
比较选择最优方案
tips:注意输出格式,除了最后一个case,其他都要输出两个换行
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=;
int a[maxn];
int main()
{
int T;
int n;
int i;
scanf("%d",&T);
// printf("\n");
while(T--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int sum=;
int p=n;
int t;
for(i=n-;i>=;i-=)
{
int t1=*a[]+a[i]+a[i-];
int t2=*a[]+a[]+a[i];
//cout<<t1<<" "<<t2<<endl;
sum+=min(t1,t2);
}
//cout<<sum<<endl;
if(i==) sum+=a[];
else if(i==) sum+=a[];
else sum=sum+a[]+a[]+a[];
printf("%d\n",sum);
for(int i=n-;i>=;i-=)
{
int t1=*a[]+a[i]+a[i-];
int t2=*a[]+a[]+a[i];
if(t1<t2)
{
printf("%d %d\n",a[],a[i]);
printf("%d\n",a[]);
printf("%d %d\n",a[],a[i-]);
printf("%d\n",a[]);
}
else
{
printf("%d %d\n",a[],a[]);
printf("%d\n",a[]);
printf("%d %d\n",a[i-],a[i]);
printf("%d\n",a[]);
}
}
if(i==) printf("%d %d\n",a[],a[]);
else if(i==)
{
printf("%d %d\n",a[],a[]);
printf("%d\n",a[]);
printf("%d %d\n",a[],a[]);
}
else printf("%d\n",a[]);
if(T) cout<<endl;
}
return ;
}
UVA 10037 贪心算法的更多相关文章
- 关于贪心算法的经典问题(算法效率 or 动态规划)
如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现.下面介绍几个经典贪心问题.(参考自刘汝佳著<算法竞赛入门经典>).P.S.下文皆是我一个字一个字敲出来的,绝对 ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
- LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
- ACM_ICPC hdu-2111(简单贪心算法)
一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- 增强学习贪心算法与Softmax算法
(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...
- 【九度OJ】题目1434贪心算法
题目 本题的贪心算法策略需要深入思考一下 看到题目,最初没有理解题目的要求:看尽量多的完整的节目.尽量多是指数量多,自己理解成观看的时间最长.这样想其实简化了这道题. 正确理解题意后,首先想到的想法是 ...
- 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)
//贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...
随机推荐
- linux下实现rm()函数删除文件或目录
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html 在linux下有两个函数可以用来删除文件: #include <unistd.h ...
- 08 - 删除vtkDataObject中的SetWholeExtent() 方法 VTK 6.0 迁移
VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中之一就是SetWholeExtent().SetWholeExtent()方法先前被用来管理结构话数据 ...
- Coursera获取中文字幕(如果有的话)
字幕的格式是 https://class.coursera.org/${课程代号}/lecture/subtitles?q=${视频编号}_zh-cn 例如 https://class.course ...
- 一句话输出网站404页面,REFER及相关排序
cat www.log|awk '$9~/404/ {print $7"," $11}'|sort|uniq -c|sort -nr > ./www404.csv
- CMake快速入门教程-实战
http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- Qt入门(3)——信号和槽
信号和槽用于对象间的通讯.信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分.在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件.更一般地,我们希望 ...
- iOS项目更新之升级Xcode7 & iOS9
金田 前言 Apple 的WWDC所发布内容在给大家带来惊喜之际,给各位iOS开发的同仁却也带来了不同程度的麻烦.首先不讲新功能,就单指原来老版本的项目升级.代码升级,就是一堆问题,而且是不 ...
- M0、M1、M2、M3都是用来反映货币供应量的重要指标
m2-反映货币供应量的重要指标编辑词条m2广义货币是一个经济学概念,和狭义货币相对应,货币供给的一种形式或口径,以M2来表示,其计算方法是交易货币(M1,即社会流通货币总量加上活期存款)以及定期存款与 ...
- sql Sever 修改表中的列名
EXEC SP_RENAME 'LeInterface.iYear','iLeYear','COLUMN' EXEC SP_RENAME 'LeInterface.imonth','iLemonth' ...