贪心算法

C++贪心算法实现活动安排问题

微笑、不失礼 提交于 2019-12-03 10:25:27
_(:з」∠)_ 1 #include <cstdio> 2 #include <iostream> 3 #include <ctime> 4 #include <windows.h> 5 #include <algorithm> 6 #include <fstream> 7 using namespace std; 8 struct activity 9 { 10 int no; 11 int start; 12 int finish; 13 }; 14 bool cmp(const activity &x, const activity &y) 15 { 16 return x.finish<y.finish;//从小到大排<,若要从大到小排则> 17 } 18 int greedySelector(int m,int solution[],struct activity activity[]){ 19 int number = 1; 20 solution[0] = 1; 21 int i,j = 0,counter = 1; 22 for(i = 1;i < m ;i++) 23 { 24 if(activity[i].start >=activity[j].finish) 25 { 26 solution[i] = 1; 27 j = i; 28 counter++;

C++贪心算法实现部分背包问题

£可爱£侵袭症+ 提交于 2019-12-03 10:25:21
_(:з」∠)_ 1 #include <cstdio> 2 #include <iostream> 3 #include <ctime> 4 #include <windows.h> 5 #include <algorithm> 6 #include <fstream> 7 using namespace std; 8 struct object 9 { 10 int no; 11 double weight; 12 double value; 13 double average; 14 }; 15 bool cmp(const object &x, const object &y) 16 { 17 return x.average > y.average;//从小到大排<,若要从大到小排则> 18 } 19 void greedySelector(int m,int W,int solution[],struct object object[]){ 20 int i = 0,V = 0,j = 0; 21 while(object[i].weight < W) 22 { 23 solution[i] = 1; 24 W = W - object[i].weight; 25 V = V + object[i].value; 26 i++; 27 } 28 V = V + (W

算法第三章作业

天涯浪子 提交于 2019-12-03 08:18:17
1. 你对动态规划算法的理解 动态规划的实质是分治思想和解决冗余,他与贪心和分治法类似,它们都将问题分为更小的类似的子问题。但贪心算法可能不能得到全局最优解,动态规划可以处理不具有贪心实质的问题。 2. 分别列出编程题1、2的递归方程 (1. f[i] = max{ f[k] | a[k] < a[i] } (1<=k<i) (2. f[i] = min{ f[k] + a[i][k] } (i<k<=j) 3. 说明结对编程情况 我和队友会先自己思索一段时间,其中一人敲另一个看,其间会有相互提问交流。 来源: https://www.cnblogs.com/qq2766022474/p/11784756.html

[CSP-S模拟测试]:午餐(贪心+最短路)

北城余情 提交于 2019-12-03 07:20:47
题目传送门(内部题115) 输入格式   第一行两个正整数$n,m$。   接下来$m$行,每行$4$个正整数$u_j,v_j,L_j,R_j$。   接下来一行$n$个数,若第$i$个数为$1$,则$i$号同学最后学会了毒瘤算法;若第$i$个数为$-1$,则$i$号同学最后没有学会毒瘤算法。若第$i$个数为$0$,则不知道$i$号同学最后是否学会了毒瘤算法。 输出格式   若结果不可能出现,输出一行$Impossible$;否则,输出$m$行,第$j$行一个正整数表示第$j$条信息中的两名同学在哪一天共用午餐。 样例 样例输入1: 4 3 1 2 1 2 2 3 1 2 2 4 1 2 1 0 1 -1 样例输出1: 2 2 1 样例输入2: 4 4 1 2 1 2 2 3 2 3 2 4 1 2 3 4 3 4 1 0 1 -1 样例输出2: Impossible 数据范围与提示   本题采用子任务评分。仅当你通过一个子任务下所有测试点时,你才能获得该子任务的分数。   对于所有数据,$1\leqslant n,m\leqslant 200,000,1\leqslant u_j,v_j\leqslant n,u_j\neq v_j,1\leqslant L_i\leqslant R_i\leqslant 10^9$。   $1.$($10$分)$n,m\leqslant 12

贪心-01-买卖最佳股票时机2

ぐ巨炮叔叔 提交于 2019-12-03 02:13:15
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。 你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2: 输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 示例 3: 输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 解答: int maxProfit(vector<int>& prices) { int i = 1; int sum = 0; while(i<prices

贪心算法之过河问题

匿名 (未验证) 提交于 2019-12-03 00:41:02
题目大意是只有一艘船,能乘2人,船的运行速度为2人中较慢一人的速度,过去后还需一个人把船划回来,问把n个人运到对岸,最少需要多久。先将所有人过河所需的时间按照升序排序,我们考虑把单独过河所需要时间最多的两个旅行者送到对岸去,有两种方式: 1.最快的和次快的过河,然后最快的将船划回来;次慢的和最慢的过河,然后次快的将船划回来,所需时间为:t[0]+2*t[1]+t[n-1]; 2.最快的和最慢的过河,然后最快的将船划回来,最快的和次慢的过河,然后最快的将船划回来,所需时间为:2*t[0]+t[n-2]+t[n-1]。 算一下就知道,除此之外的其它情况用的时间一定更多。每次都运送耗时最长的两人而不影响其它人,问题具有贪心子结构的性质。即比较t[n-2]+t[0]和2t[1]的大小 下面我们来证明为什么该策略为最优策略: 一.首先证明,先送的应该是最慢的两个: 1.如果t[n-2]+t[0]-2t[1]<0 ,那么,就说明,用最小t[0] 分别单独送最慢和次慢的,要 优于让最慢和次慢 一起过河。那么这样,由于其他的t[i]<t[n-2] ,所以,t[i]+t[0]-2t[1]<t[n-2]+t[0]-2t[1]<0 所以让最小的t[0] 分别送所有的人,优于让他们中的任意两个人组合一起过河。所以这种情况下过河的总过程可以看成是,判断最慢的两个人是否应该一起过河,然后再继续判断下一个。 2

贪心算法解背包问题

匿名 (未验证) 提交于 2019-12-03 00:26:01
问题描述: 给定 n 个物品和一个容量为 C 的背包,请 给出物品装入背包的方案,使得背包中物品的总价值 M 最大,并 满足: 每个物品 I 的重量为 w i ,价值为 v i 。 每个物品可拆分,背包中物品的总重量不能超过容量 C 。 实验要求: 程序实现要求: 1 )先写排序算法 Rank() ,再写贪心算法 Greedy() 。 2 )两个步骤需要单独定义在程序里,不写在主函数里。 贪心算法解背包问题的基本步骤: 1 )计算每种物品单位重量的价值 V i / W i 2 )依贪心选择策略,将尽可能多的 单位重量价值最高 的物品装入背包。 3 )若将这种物品全部装入背包后,背包内的物品总重量未超过 C ,则选择单位重量价值次高的物品并尽可能多地装入背包。 4 #include<stdio.h> #define N 100 int v[N];//价值 int w[N];//重量 float fw[N];//防止比例小数,转换重量用 int record[N];//记录排序后每个数字原来位置,从0开始,对应vw数组 int C;//给出背包容量 int n;//物品个数 int M=0;//背包容量为C时最大价值 int SurplusC;//剩余背包重量 void swap(int *x,int *y){//交换函数 int temp; temp=*x; *x=*y; *y

1059: 田忌赛马 贪心算法

匿名 (未验证) 提交于 2019-12-03 00:18:01
1059: 田忌赛马 128 MB 347 [ 提交 ][ ״̬ ][ 讨论版 ] 题目描述 田忌和齐王赛马,两人各出n匹马,赢一场比赛得200两银子,输了赔200银子,平局不赔不赚.已知两人每匹马的速度,问田忌最多能赢多少银子. 输入 多组测试数据, 第二行包括n个整数既田忌每匹马的速度. 第三行包括n个整数既齐王每匹马的速度. 每匹马的速度不超过1000. 输出 对于每组数据输出一行有一个整数代表田忌最多能赢多少银子 样例输入 3 22 18 样例输出 20 0 0 0 大一进来不久的时候第一次做了这个题目,结果给这个题目摆了一道,研究了半天没懂,后来就对这个贪心算法心生恐惧。 现在准备正式攻略一下。 先转载一段贪心算法的定义和核心: 点击打开链接 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 解题的一般步骤是: 1.建立数学模型来描述问题; 2.把求解的问题分成若干个子问题; 3.对每一子问题求解,得到子问题的局部最优解; 4.把子问题的局部最优解合成原来问题的一个解。 说白了就是在把问题分开每一步都取最优解,这就是贪心

【Leetcode】买卖股票-贪心算法

匿名 (未验证) 提交于 2019-12-03 00:14:01
题目: 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 思路: 采用贪心算法,如果当天股票的价格 p i 大于等于前一天的股票价格 p i-1 则持续持有。如果低于前一天的价格,则在前一天就抛售股票。 时间复杂度:O(N)。从头遍历每一天的股票价格。 空间复杂度:O(1)。 class Solution { public: int maxProfit(vector<int>& prices) { int buyin = 0, keep = 1, profit = 0; int len = prices.size(); while(buyin+keep < len) { int buyP = prices[buyin]; for(keep; keep < (len-buyin); keep++) { if(prices[buyin+keep-1] > prices[buyin+keep]) { if(keep > 1) { profit = profit + (prices[buyin+keep-1] - buyP); } break; } else { if(buyin+keep+1 == len) profit = profit + (prices[buyin

反悔贪心

有些话、适合烂在心里 提交于 2019-12-02 23:53:26
目录: 个人理解 反悔贪心的分类 反悔自动机 反悔堆 例题简析及代码 一、个人理解: 贪心本身是没有反悔操作的,贪心求的就是当前的最优解。但当前的最优解有可能是局部最优解,而不是全局最优解,这时候就要进行反悔操作。 反悔操作 指的是这一步的贪心不是全局最优解,我们就退回去一步(人工或自动判断),换一种贪心策略。按照 判断方式 的不同可以分为 反悔自动机 和 反悔堆 两种方法。 二、反悔贪心的分类: 反悔自动机: 即设计一种反悔策略,使得 随便 一种贪心策略都可以得到正解。 基本的设计思路是:每次选择 直观上最接近全局最优解 的贪心策略,若发现最优解不对,就想办法 自动 支持反悔策略。(这就是自动机的意思) 具体题目具体分析。 反悔堆: 即通过 堆 (大根堆、小根堆)来维护当前贪心策略的最优解,若发现最优解不对,就退回上一步,更新最优解。 由于堆的性质,使得堆的 首数据 一定是最优的,这就可以实现 快速更新最优解 。 三、例题简析及代码 USACO09OPEN 工作调度Work Scheduling (反悔堆) Description : 有 \(n\) 项工作,每 \(i\) 项工作有一个截止时间 \(D_i\) ,完成每项工作可以得到利润 \(P_i\) ,求最大可以得到多少利润。 Method : 做这道题的时候并没有想到反悔贪心,只是想到一个错误的贪心算法