贪心算法

剑指offer-动态规划-贪心算法--剪绳子-python

北城以北 提交于 2019-12-04 20:42:30
题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 输入描述: 输入一个数n,意义见题面。(2 <= n <= 60) 思路:动态规划:有这几个特殊情况:当n为0时,没发裁输出为0n为1时,最大分子为1,输出1n为2时,最大分子为2,输出2n为3时,最大分子为2,输出2然后从4开始遍历,将切割的所有可能找出来,,由于当i大于n//2时,就不用在计算了,重复计算,然后与之相乘 temp = prod[i] * prod[n - i]最后将结果与max作比较,放入数组中去。 class Solution: def cutRope(self, number): # write code here # res=1 if number <= 1: return 0 elif number <= 2: return 1 elif number <= 3: return 2 prod = [0, 1, 2, 3] for n in range(4, number + 1): maxs = 0 for i in range(1, n//2): temp

程序存储问题

纵饮孤独 提交于 2019-12-04 18:14:52
一.实践题目 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。 输出格式: 输出最多可以存储的程序数。 输入样例: 在这里给出一组输入。例如: 6 50 2 3 13 8 80 20 输出样例: 在这里给出相应的输出。例如: 5 二.问题描述 程序存储问题即为将n个程序放在长度固定的磁带上,这些程序在磁带上的长度不同,求磁带上最多可以放多少个程序 三.算法描述 贪心策略为每次都选择剩下的程序中长度最小的一个程序放进磁带中。 设程序P={1, 2, ...,n}按程序在磁带上的长度非递减排列,则程序1的长度最小。 贪心选择性质: 要确定问题是否具有贪心选择性质,则要证明每步所做的贪心选择最终导致问题的整体最优解,也即问题的整体最优解包含每一步的贪心选择。对于该问题,即证明该最优解中包含程序1。证明: 设A是最优解,且A中最先放入磁带的是程序k。 若k = 1,则最优解包含程序1,即A是一个以贪心选择开始的最优解。 若k>1

贪心算法?我全都要!——算法第四章上机实践报告

≡放荡痞女 提交于 2019-12-04 18:10:48
算法第四章上机实践报告 一、 实践题目 4-1 程序存储问题 (90 分 ) 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。 输出格式: 输出最多可以存储的程序数。 输入样例: 在这里给出一组输入。例如: 6 50 2 3 13 8 80 20 输出样例: 在这里给出相应的输出。例如: 5 二、 问题描述 先输入程序个数和磁带长度,下一行依次输入每个程序的长度,从而选择一种储存方式使得储存的程序个数最多(选择的程序总长不能超过磁带长度)。 要尽可能多的储存程序,那么只需要每次都挑最短的加入进磁带即可,用到贪心算法的思维,可描述为: 式中,变量xi=0表示第i个程序不装入磁带,xi=1表示第i个程序装入磁带,L是磁带总长,li是第i个程序的长度。 三、 算法描述 1、贪心算法 sort(a,a+n); int p = 0, count = 0; for(int i = 0; i < n; i++) { count += a[i];

算法第四章上机实践报告

北战南征 提交于 2019-12-04 15:16:17
算法第四章上机实践报告 程序储存问题 实践题目 设有 n 个程序 {1,2, … , n } 要存放在长度为 L 的磁带上。程序 i 存放在磁带上的长度是 li , 1 ≤ i ≤ n 。 程序存储问题要求确定这 n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的 n 个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 问题描述 程序储存问题可以用贪心算法求解。采用存放长度最短者优先存储的贪心选择策略,可以产生程序储存问题的最优解。 算法描述 #include <iostream> #include <algorithm> using namespace std; int w[100000000]; int storage(int w[], int c, int n) { sort(w, w + n); int count = 0; for (int i = 0; i < n && w[i] <= c; i++) { c -= w[i]; count++; } return count; } int main() { int n; int c; cin >> n >> c; for (int i = 0; i < n; i++) { cin >> w[i]; } cout << storage( w, c, n); return 0; }

最优装载问题_贪心

久未见 提交于 2019-12-04 03:43:59
一、 问题描述 有一批集装箱要装上一艘载重为C的轮船。其中集装箱i的重量为Wi。最优装载问题要去确定在装载体积不受限制的情况下,将极可能多的集装箱装上轮船。 二、 解题思路及所选算法策略的可行性分析 使用贪心算法。 问题描述为 : max∑Xi,∑WiXi<=C,Xi∈{0,1} 1<=i<=n 其中,变量Xi=0表示不装入集装箱i,Xi=1表示装入集装箱i。 贪心选择性质 : 设集装箱已依其重量从小到大排序,(X1,X2,…,Xn)是最优装问题的一个最优解。又设k=min{i|Xi=1}。易知,如果给定的最优装载问题有解,则1<i<=n,i!=k,则 ∑WiYi = Wi - Wk + ∑WiXi <= ∑WiXi <= C 因此,(Yz,Y2,…,Yn)是所给最优装载问题的可行解。 另一方面,由∑Yi = ∑Xi知,(Y1,Y2,…,Yn)是满足贪心选择性质的最优解。 最优子结构性质 : 设(X1,X2,…,Xn)是最优装载问题的满足贪心选择性质的最优解,则容易知道,X1=1,且(X2,…,Xn)是轮船载重量为C-W1,待装载集装箱为{2,3,…,n}时相应最优集装箱问题的最优解。也及时说,最优集装箱装载问题具有最优子结构性质。 三、 代码描述及复杂度分析 Loading(float c, float[]w, int[] x) { 创建集装箱数组,存放每个集装箱重量及其序号;

贪心算法

时光毁灭记忆、已成空白 提交于 2019-12-04 03:37:53
前言 贪心?本质上要先找到 影响问题的根本因素 ,再安排 最优化 策略。 热身题 ——找找本质 SMOJ 2534 题意 你有 \(n\) 头奶牛,第 \(i\) 头奶牛的产奶量是 \(c_i\) 升。有 \(m\) 个小卖部,第 \(i\) 个小卖部需要牛奶 \(q_i\) 升,每升的采购价格是 \(p_i\) 元。有 \(r\) 个农场,每个农场至多购买1头奶牛,收购价为 \(r_i\) 元。 对于每一头奶牛,你有 \(2\) 种选择:1、卖给某个农场。2、把该头奶牛产的牛奶卖给小卖部;不一定要1次卖完。 请最大化总收益。 \(1 \leq n,m,r \leq 10^5\) 。 题解 收益只有 \(2\) 种:来自农场,来自小卖部。 若1头牛卖给农场,收益与该奶牛的产奶量无关,只与该农场的收购价有关。 若1头牛不卖给农场,收益与它卖出的奶量、小卖部的收购单价有关;更准确的说,不同奶牛的奶本质相同,可以将所有奶牛的奶集中起来再卖给特定的小卖部。 既然任一卖入农场的奶牛的收益只与农场收购价有关,那么我们应该按照收购价从大到小的顺序安排奶牛对应的农场;进一步地,卖入农场的总收益仅与卖入农场的奶牛数目相关。除去卖入农场的奶牛,我们可将剩余的奶牛的奶集中处理,按照采购单价从大到小的顺序卖给小卖部;这部分的收益仅与剩余奶牛的总奶量有关。 因此,不妨枚举卖入农场的奶牛数目 \(x\)

好题记录

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 23:56:21
2019.6 Codeforces 1166C A Tale of Two Lands 给定一个数列,求其中满足 \(min\{|x+y|,|x-y|\} \leq min\{|x|,|y|\}\) 且 \(max\{|x|,|y|\} \leq max\{|x+y|,|x-y|\}\) 的数对 \((x,y)\) 个数。 \(n \leq 2 \times 10^5\) 。 如果去分类讨论 \(x,y\) 的符号会把问题变得非常复杂。观察条件包含的性质,发现这个条件是与 \((x,y)\) 的 符号无关 的。也就是说如果将所有数都取其绝对值不会影响答案。 只需要考虑非负数的情况,那么排序之后对于每个 \(x\) 求出 \(y\) 的取值范围二分统计一下即可。复杂度 \(O(n \log n)\) 。 Codeforces 437 C. The Child and Toy 给出一个带点权的无向图,每次选择一个点删除,并删除这个点所连的边。删除一个点的代价是此时其所有相邻点的权值之和。问删完所有点的最小总代价。 \(n \leq 1000, m \leq 2000\) 。 删点的实质是在删边,每条边都会被删一次。正向反向考虑都很难,我们考虑每条边被删除时对答案产生的贡献。每条边被删除时它的两个端点中其中一个产生贡献。为了让答案尽量小,不妨假设每次都是点权较小的那个产生贡献

贪心算法----最小差距

亡梦爱人 提交于 2019-12-03 21:00:29
题目描述    给定一些不同的一位数字,你可以从这些数字中选择若干个,并将它们按一定顺序排列,组成一个整数,把剩下的数字按一定顺序排列,组成另一个整数。组成的整数不能以0开头(除非这个整数只有1位)。   例如,给定6个数字,0,1,2,4,6,7,你可以用它们组成一对数10和2467,当然,还可以组成其他的很多对数,比如210和764,204和176。这些对数中两个数差的绝对值最小的是204和176,为28。   给定N个不同的0~9之间的数字,请你求出用这些数字组成的每对数中,差的绝对值最小的一对(或多对)数的绝对值是多少? 输入数据    第一行包括一个数T(T<=1000) ,为测试数据的组数。   每组数据包括两行,第一行为一个数N ( 2≤N≤10),表示数字的个数。下面一行为N 个不同的一位数字。 输出数据    T行,每行一个数,表示第i个数据的答案。即最小的差的绝对值。 样例输入 2 6 0 1 2 4 6 7 4 1 6 3 4 样例输出 28 5 *****解决方案***** 【思路】 如果采用暴力穷举的方法,如果将N个数分为两组,两组中数字个数的差不超过1,这种情况下,时间复杂度为Cn n/2*(n/2)!*(n/2)!,时间复杂度比较大。 在此将问题分为几类: (1) n=2:直接判断; (2) n为奇数:将数字序列进行升序排序后

机房测试:lunch(贪心+最短路)

社会主义新天地 提交于 2019-12-03 11:29:15
题目: 分析: 由数据3得:既然所有人都要学会,肯定是越早学越优。( 贪心 重要思路) 所以转移就是: dis[v]=max( dis[u] ,L ) ,u学会之后传授给v的条件是:u先学会,传授的时间在吃饭的时间内 在最短路上转移即可 再考虑有人必须学不会的限制。 如果有一个人u没有学会,就会给他周围的人v一个限制:v不能太早学会,否则吃饭的时候v就会传授给u 所以将lim[v]定为L+1,即他们在L的时候吃饭,L+1的时候v才学会,不会传给u 先将这种传递关系用spfa预处理 再跑一边dij求出每个人最早在多久学会。(将u、v之间的连边关系视作u学会了传授给v来更新v) 转移的时候是这样转移的: dis[v]=max( L,max( dis[u],lim[v] ) ) 原因: L指在这个区间内 ,dis指 u要先学会 , lim v 指在v学会的范畴内(防止出现v太早学会而将算法传给后面的人 这就是lim的作用) #include<bits/stdc++.h> using namespace std; #define N 200005 #define ri register int #define inf 1000000007//一定要足够大 否则会错!! int tot=0,to[N<<1],head[N],nex[N<<1],l[N<<1],r[N<<1],dis[N]

算法设计分析之贪心算法

冷暖自知 提交于 2019-12-03 11:13:31
  贪心算法,是一种“只顾眼前”的价值观。远古的人会有这样的人生态度,我只关注每天能吃饱,就可以活下去。在几百万年前未尝不是一种好算法。 贪心算法的条件   贪心算法需要满足无后效性。什么是有后效性呢?我当前这一步会给整个问题的情况带来改变。比如有一个路径问题,规定了走过的路不能再走,那这就是一个有后效性的问题。   贪心算法也不适应那些活动收益不同的问题。比如背包问题:假设现在有几样价值不同,体积不同的东西需要装进容积为F的背包里,要求装入的总价值最大。用贪心算法来解,不能保证得到最优解。 贪心策略1:先装价值最大的东西。F=40,a(20,30),b(18,20),c(19,20)“前者价值,后者为体积”,这个情况贪心算法会选第一个a,但显然更好的选择是b&c, 贪心策略2:先装最小的。F=40,a(10,15),b(10,20),c(35,20).贪心算法会选a&b,但是显然b&c更好 贪心策略3:优先选择单位价值最大的。F = 40,a(10,10),b(20,10),c(35,40),贪心算法会选a(1)&b(2),但是c(0.825)是更好的选择。 (当然上面的例子有点为难贪心算法的感觉,但是现实世界里就是这样,不会因为你的算法而改变问题来适应你) 贪心算法的应用 最优前缀码的构造。 (未完待续) 来源: https://www.cnblogs.com