贪心算法

7月清北学堂培训 Day 1

匿名 (未验证) 提交于 2019-12-02 23:48:02
基础算法 模拟算法 面向测试算法 模拟算法的关键就是将人类语言翻译成机器语言。 要做到以下两点: 1.优秀的读题能力; 2.优秀的代码能力; 程序流程图: 读入,循环处理指令,输出; 读题是很重要的,我们要考虑到用什么样的方法,怎么写; 主要就是要看懂四条规则然后往里面填数就好了,好像很简单,那就看这个题: 我们要先抓住核心部分: 手里有n张牌,有k(k<?)个规则,每个规则可以打出一定的牌,请问要打出最小多少次牌; 一个明显的深搜: void dfs(剩下多少张牌没打last,打了多少次牌ans) { if(last==0) //牌打完了 回溯 if(k条规则) …… } 模拟题更强调的就是选手的代码能力,其特点是:题目特烦,细节超多,代码极长; 考验的全部都是选手写代码的基本功: 1.写长代码都不出错的能力; 2.多方面全地考虑问题; 前者要求我们有一个良好的代码习惯,而后者则要求我们在做题时头脑有清晰的逻辑; 注意标准形式缩进; 一个笑话: 所以写长代码的要领在于一遍就写对! Solution: 模块化结构(如何去思考一个问题?); 没想清楚时不动笔,画程序逻辑图; 写完一部分就检查一部分;最好一次AC; 在赛场上检验自己的程序是否正确的方式有两种: 1.造数据; 2.对拍; 对拍其实就是模拟算法的一种应用; 因为暴力算法的本质就是模拟(大雾) 2. 贪心算法

贪心算法+实例

匿名 (未验证) 提交于 2019-12-02 23:47:01
贪心算法(又称贪婪算法)是指,在对 问题求解 时,总是做出在当前看来是最好的选择。也就是说, 不从整体最优上加以考虑,他所做出的是在某种意义上的局部 最优解 。(官方解释)。 所谓的贪心算法主要理解就在这个“贪心”上面,所谓贪心,就是找到最好的,也就是上面说的最优解。 我们可以通过各种方式找到当前的最优解,将最有解利用过后,将其清除,再去找下一个最优解。 来一个例子来说明。 题目描述 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图 11 1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。” 我们假定多多在每个单位时间内,可以做下列四件事情中的一件: 1) 从路边跳到最靠近路边(即第一行)的某棵花生植株; 2) 从一棵植株跳到前后左右与之相邻的另一棵植株; 3) 采摘一棵植株下的花生; 4) 从最靠近路边(即第一行)的某棵花生植株跳回路边。 现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。 例如在图2所示的花生田里,只有位于

贪心题目(一)

匿名 (未验证) 提交于 2019-12-02 23:47:01
贪心法(又称贪婪法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 HDU 1009(贪心) FatMouse' Trade Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food.

贪心算法小结

匿名 (未验证) 提交于 2019-12-02 23:43:01
M-Cleaning Shifts 描述 你的任务是帮助FJ安排一些奶牛,使每段时间至少有一只奶牛被安排来做这件事。并且奶牛数应尽可能小。如果不可能办到,输出-1 输入 注意,输入包含多组测试数据,请处理到文件结束 * 第二行至N+1行: 每一行包括奶牛能工作的开始和结束时间。闭区间。 输出 *每组数据一行,输出完成清洁所需最少的奶牛数,如果不可能办到,输出-1 样例输入 3 10 1 7 3 6 6 10 样例输出 2 提示 选择 cows #1 和 #3即可,没有更优的方案了 .   思路:仍旧采用贪心的解法 ,选取最优解。为了使用最小的牛覆盖所有时间段 ,就要使用开始的早,工作时间长的牛(具体实现使用cmp排序,优先级高的是开始时间,开始时间相同时比较结束时间,结束时间晚的优先);还要考虑一点即是所有牛的工作时间段 需要覆盖整个T时间段,中间不能有空缺(可以进行循环比较,当循环到某个牛该牛的工作开始时间比上一个工作的牛的结束时间相等或大于的时候,跳出循环)。代码如下: #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <math.h> #include <queue> #include <map> #include

必刷贪心题

这一生的挚爱 提交于 2019-12-02 23:20:11
背包问题 01背包裸题。因为物品不可分割因此不可贪心。 搬书 Luogu P2374 看起来可以贪心,但是事实上由于体力系数在变化,因此每次选出每堆质量最大的书并不能得到最优解。于是考虑DP。设 \(dp[i][j][k]\) 表示当前考虑到每堆第 \(i,j,k\) 本书。当前状态只能由 \(dp[i-1][j][k],dp[i][j-1][k],dp[i][j][k-1]\) 更新而来。因此方程就可以显然地列出来了。 排队问题 Luogu P1223 贪心入门题。按照 \(t\) 从小到大排序统计就行。显然把小的放在前面比把大的放在前面更优。 神牛果 把吃的数量从小到大排序,每次让最大和最小的组合就可以了。 修理牛棚 Luogu P1209 我们可以先假设只有一块木板从编号最小的牛棚一直铺到编号最大的牛棚,然后断开 \(m-1\) 处。自然要按相邻牛棚的编号差从大到小断开才能使我们断开的地方可以有效节省木板长度(因为中间省去的要更多) 删数 Luogu P1106 首先,考虑第一位。将第一位所有可能的位置枚举一下,取最小且最前的一个。因为同样长度的数字比较看开头,于是这样便保证了第一位的最优性。要注意,要取最前的一个,尽量保留更多的可选数。而第二位就在第一个数之后的所有允许范围内枚举,方法同第一位。这样,取完了所有要取的数,然后输出就可以了。 奶酪工厂 POJ 2393

用Python解决TSP问题(2)――贪心算法

匿名 (未验证) 提交于 2019-12-02 22:54:36
文章源码在Github: https://github.com/jinchenghao/TSP 本介绍用python解决TSP问题的第二个方法――动态规划法 算法介绍 动态规划算法根据的原理是,可以将原问题细分为规模更小的子问题,并且原问题的最优解中包含了子问题的最优解。也就是说,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 我使用DP求解TSP问题的主要分为三个主要部分: T(s,init)代表的意思是从init点出发经过s中全部的点回到init的距离。 程序 输入: 1 2066 2333 2 935 1304 3 1270 200 4 1389 700 5 984 2810 6 2253 478 7 949 3025 8 87 2483 9 3094 1883 10 2706 3130 代码: """ 动态规划法 name:xxx date:6.8 """ import pandas as pd import numpy as np import math import time dataframe = pd.read_csv("./data/TSP10cities.tsp",sep=" ",header=None) v = dataframe.iloc[:,1:3] train_v= np

用Python解决TSP问题(1)――贪心算法

匿名 (未验证) 提交于 2019-12-02 22:54:36
文章源码在Github:https://github.com/jinchenghao/TSP 关于TSP问题网上有很多介绍,这里再简单描述一下。旅行商问题(TravelingSalesmanProblem,TSP)一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要遍历所有城市一次且只能一次,回到出发地。应如何选择行进路线,以使总的行程最短。目前解决TSP问题的方法有许多种,比如:贪心算法、动态规划算法、分支限界法;也有智能算法,比如:蚁群算法、遗传算法、A*等。由于网上使用python解决这类问题的比较少,所以我会用python实现这些算法。本文先介绍贪心算法: 数据格式 数据格式如下: 城市 X Y City1 100 200 City2 150 200 City3 345 313 ... 即输入的数据有3列,第一列是城市编号,第二列和第三列是城市坐标(x,y)。 算法简介 贪心算法非常容易理解,是一种解决实际问题中的常用方法,经常用来和其他算法进行比较。所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性

贪心算法之――黑白点的匹配(两种实现方法)

匿名 (未验证) 提交于 2019-12-02 21:52:03
一、题目 二、解题思路 ) http://5b0988e595225.cdn.sohucs.com/images/20171101/f1f45fe9ca37425ba200180be89624b2.gif http://5b0988e595225.cdn.sohucs.com/images/20171101/a85c0716fcc847f1915dddfcfd019c01.gif 1 、如何将黑白点化作图: 创建一个结构体 黑白点都看作顶点,只通过color进行区别 2 、如何求对应邻接矩阵: 对储存所有顶点的结构体数组做两次循环,若满足题目中黑点xy坐标大于白点,即将邻接矩阵该位置置为1。 3 、具体流程演示: 三、代码(DFS BFS两种实现方法) 1 public class MaxMatching { // 基于DFS 2 3 static int graph [][]; // 邻接表 默认全为0 4 static int n ; // 节点数 5 static int visit []; // 是否访问 6 static int matched []; // 是否已经匹配,对应的匹配点 7 static vertex V []; //// 结构体数组储存所有黑白 8 9 public class vertex { // 顶点结构体 10 public int color

Java蓝桥杯――贪心算法

匿名 (未验证) 提交于 2019-12-02 21:52:03
贪心算法:只顾眼前的苟且。 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买。 货物重量:Wi={4,10,7,11,3,5,14,2} 海盗船载重:C 求如何拿货件数最多 package bb; import java.util.Arrays; public class 最优装载 { static int[] W = { 4, 10, 7, 11, 3, 5, 14, 2 }; static int C = 30; // 开发效率: // 运行效率: public static void main(String[] args) { int count = 0; Arrays.sort(W); for (int n : W) { System.out.println(n); } System.out.println("------------"); // 从小的开始装 for (int i = 0; i < W.length; i++) { if (C < W[i]) { // 剩余的载重量装不下一件 break; } else { System.out.println(W[i] + " "); count++;// 装进来 C = C - W[i]; } } System.out.println("一共带走:" + count + "件"); } }

捡石子---贪心算法(huffman)

本秂侑毒 提交于 2019-12-02 20:53:17
问题 E: 捡石子 时间限制: 1 Sec 内存限制: 128 MB 提交: 49 解决: 31 [ 提交 ][ 状态 ][ 讨论版 ] 题目描述 在一个圆形操场的四周摆放着 n堆石子。 现要将石子有次序地合并成一堆。 规定每次选2 堆石子合并成新的一堆,合并的费用为新的一堆石子数。试设计一个算法,计算出将 n堆石子合并成一堆的最小总费用。 输入 输入数据第1行有1个正整数 n(1≤n≤1000),表示有 n堆石子,每次选2堆石子合并。第2行有 n个整数, 分别表示每堆石子的个数(每堆石子的取值范围为[1,1000]) 。 输出 数据输出为一行, 表示对应输入的最小总费用。 样例输入 7 45 13 12 16 9 5 22 样例输出 313 提示 中南大学计算机&软件复试QQ群552889929 [ 提交 ][ 状态 ] #include <stdio.h> #include <stdlib.h> int cmp( const void *a, const void * b) { return (*( int *)b-*( int *)a); // 实现的是降序排序 } int main( int argc, char * argv[]) { // 哈夫曼树的应用 int n; int a[ 1005 ],i,j,sum; while (scanf( " %d " ,&n)!=