ACM:贪心法:乘船问题。

题目:有n个人,第i个人的重量为wi,每艘船的最大载重量均为C,且最多只能乘两个人。用最少的船装载所有人。

分析:贪心法!

考虑最轻的人i,他应该和谁一起坐呢?如果每个人都无法和他一起坐船,那么唯一的方案就是每个人坐一艘船!

否则,他应该选择能和他一起坐船的人中最重的一个j。

这样的方法是贪心的!因为:它只是让“眼前”的浪费最少。

程序实现:我们只需用两个下标i和j分别表示当前考虑的最轻的人和最重的人,每次先将j往左移动,直到i和j可以共坐一艘船,然后i加1,j减1。并且重复上述操作!

复杂度是o(n)。

代码:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int MAXN = 10000;
int arr[MAXN];

int main() {
	int n, C;   //C表示每艘船的最大载重量
	cin >> n >> C;
	for(int i = 1; i <= n; ++i) {
		cin >> arr[i];
	}
	sort(arr+1, arr+n+1);
	int i = 1, j = n;
	int ans = 0;
	while(i < j) {
		if(arr[i] + arr[j] > C) j--;
		else if(arr[i] + arr[j] <= C) {
			ans++;
			i++;
			j--;
		}
	}
	cout << ans + n - (2*ans) << endl;
	return 0;
}

最后的输出应该是已经配对的数量 + 剩下的人数!

剩下的人数 = 总的人数n - 减去配对成功的人数!

配对成功的人数 = 2 * ans。

ans代表已经配对的对数!

ACM:贪心法:乘船问题。

时间: 2024-09-28 06:10:07

ACM:贪心法:乘船问题。的相关文章

8.4 贪心法

1.背包问题: ①最优装载问题:把物体重量从小到大排列,依次选择每个物体,只顾眼前,却能得到最优解. ②部分背包问题:把物体的"价值除以重量的值"从小到大排序,一次选择每个物体(贪心只能对一个变量贪心,这是一种巧妙的转换). ③乘船问题:只让眼前的浪费最少.(注意是让什么最少,是让浪费最少!) 2.区间相关问题(排序:排左边还是右边?): ①选择不相交区间: ②区间选点问题: ③区间覆盖问题: 3.定义: 在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑

贪心法 codevs 1052 地鼠游戏

1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不但学习刻苦,而且善于经常总结.完善自己的学习方法,所以他总能在每次考试中得到优异的分数,这一切很大程度上是由于他是一个追求效率的人. 但王钢也是一个喜欢玩的人,平时在学校学习他努力克制自己玩,可在星期天他却会抽一定的时间让自己玩一下,他的爸爸妈妈也比较信任他的学习能力

[LeetCode]wildcard matching通配符实现之贪心法

前天用递归LTE,昨天用动态规划LTE,今天接着搞,改用贪心法.题目再放一次: '?'匹配任意字符,'*'匹配任意长度字符串 Some examples: isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*"

贪心法

贪心法(Greedy Approach)又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解.如单源最短路经问题,最小生成树问题等.在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似. 贪心法的设计思想 当一个问题具有以

C语言(贪心法)

C语言有这样一个规则,每一个符号应该包含尽可能多的字符.也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果字条可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分,如果可能,继续读入下一个字条,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的符号.这个处理的策略被称为"贪心法".需要注意的是,除了字符串与字符常量,符号的中间不能嵌有空白(空格.制表符.换行符等). 看一下下面的代码:想一下输出

算法题解之贪心法

Wiggle Subsequence 最长扭动子序列 思路1:动态规划.状态dp[i]表示以nums[i]为末尾的最长wiggle子序列的长度.时间是O(n^2). 1 public class Solution { 2 public int wiggleMaxLength(int[] nums) { 3 if (nums == null || nums.length == 0) { 4 return 0; 5 } 6 int[] pos_dp = new int[nums.length]; 7

贪心法-c语言的规则

在面试的过程中,有很多的考验对c的认识的情况,有时会被问到有关字符搭配以及运算先后顺序的问题,比如a+++++b的值,++i+++i+++i+i的值等类似的,这都属于c的符号方面的问题,那么怎样才能轻而易举的去认识它呢? c语言有这样的一个规则:那就是传说中的贪心法,规则是这样定的:每个符号应该包含尽可能多的字符,也就是说,我们的编译器将程序分解成符号的方法是,从左到右一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,然后在判断已经读入的两个字符是否有可能是一个符号或者一个符

理解动态规划、分治法和贪心法

本文转自:http://www.cnblogs.com/airwindow/p/4067902.html http://hi.baidu.com/35661327/blog/item/d5463e17f1e8d011972b439c.html 动态规划.分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法. 但是三者的应用场景和性质却存在着极大的不同: 1.分治法 很容易与动态规划问题混淆,但两者却有着本质上的差异. 分治法采用的是递归的思想来求解问题,两个

第八章 (二)贪心法

贪心是一种解决问题的策略. 背包相关问题 最优装载问题:给出n个物体,第i个物体重量为wi.选择最多的物体,使得总重量不超过C. 每次都选择装最轻的,这是一种典型的贪心算法,它只顾眼前,却能得到最优解. 部分背包问题:有n个物体,第i个物体的重量为wi,价值为vi.在总重量不超过C的情况下让总价值尽量高.每一个物体都可以只取走一部分,价值和重量按比例计算. (选取Vi/wi最大的,因为可以取部分,所以一定会达到重量C这一目标) 乘船问题:有n个人,第i个人重量为wi.每艘船的最大载重量均为C,且