随笔分类 - 贪心法
摘要:题意:要完成一批作业,假定每一科作业花的时间都为一天,若该科不能在相应的期限能完成,则扣除相应的分数,问完成这些作业最少扣多少分分析:贪心题贪心策略:先将作业按扣分值从大到小排序,若大小相等,则按期限从小到大排序。之后,用一个数组标记该天是否已用于完成作业。依次枚举每一科作业,从该科的期限往左移,若存在一天为用过的,则标记,否则,扣分View Code #include<iostream>#include<algorithm>#define MAXN 1000+10using namespace std;int n;bool vis[MAXN];struct work{
阅读全文
摘要:hdu 4023 Game题意:Alice还有Bob 轮流在已知的15中俄罗斯方块上放置瓷砖,Alice放置的是垂直的2*1的矩形,Bob放置的是水平的1*2的矩形,Alice 先开始放,最后没位置可以放者输,输出最后的胜者;分析:题目看似博弈,却是一道贪心+模拟(其实我一开始也死命的认为是博弈,而且,因为博弈还没怎么搞过,就直接跳过了,是看了大牛的提示才知道的);有这样十五种俄罗斯方块:很明显,各种方块对俩人而已是有利也有弊的,俩个人都有自己想优先选择放置的方块。(1,2),都是对于自己稳定的(3,4) (5,6) 前者对B最有利,后者对A最有利(7,8),(9,10),前者对B最不利,后者
阅读全文
摘要:题目大意:向一个容量为V的洞中搬物品 每件物品有一个停放体积 可一个移动体积 问能否放下这些物品解题思路:对这些物品进行排序 按照顺序依次进入洞中 排序要尽可能使得所有的东西都能进入洞中这是一个贪心的问题 停放体积 移动体积 第一件物品 a1 b1 第二件物品 a2 b2假设这两件物品的移动体积都不大于洞的体积V那么将单独比较两个物品的时候会发现 a1+b2为先放第一件物品 后放第二件物品的最大瞬时体积 a2+b1为先放第二件...
阅读全文
摘要:这两天被Dilworth、链和反链搞到头昏脑胀,终于有点眉目,现在来总结一下。Dilworth定理说的是:对于一个偏序集,其最少链划分数等于其最长反链的长度。Dilworth定理的对偶定理说的是:对于一个偏序集,其最少反链划分数等于其最长链的长度。Dilworth定理先不证,有空再不上来,其对偶定理证明如下:设一个偏序集S的最少反链划分数是p,最长链长度是r。1.先证p≥r。这是显然的,因为最长链长度是r,r个元素中的任意两个都可以比较,因此它们必定两两属于不同的反链,因此反链个数≥r,即p≥r。2.再证r≥p。设X1=S。找出X1的所有极小元组成集合Z1,将其从X1删之,得到X2,再找出X2
阅读全文
摘要:这俩道题目的代码基本和pku 3636一样的主要的区别就是第二个元素排序时同样也是递增排序,因为第一个元素相同时,第二个元素按递增顺序可以全部加入,不用重新再增加桶所以后面的一个判断条件也要将等号去掉pku1065#include<iostream>#include<algorithm>using namespace std;struct Node{ int h,w; bool operator<(Node a){ if(a.w==w) return h<a.h; return w<a.w; }}ele[5010];int a[5010];int ma
阅读全文
摘要:题型: 贪心思路: 由于一个盒子在考虑放入另一个盒子之前,要考虑两个因素,宽和高,如果我们能够消除一个因素,就在一维的条件下考虑会简单些。怎么才能降低维数呢。因为只有w小于另一个时才能才能考虑是否能放,所以我们就把w从小到大排序,这样大体盒子的先后顺序就有了,我们在比较的时候就不需要考虑宽了,因为只有后边的盒子才能容纳前边的盒子先不考虑w和h相同的情况,排好序后,从第一个盒子开始遍历,第一个盒子不能容纳其他任何的盒子(宽最小),所以直接做为一个桶了。然后第二个,看他能不能容纳第一个,只需考虑h满足要求与否。然后第三个,问题来了,它既能容纳第一个,又能容纳第二个,选择哪一个,贪心就在这,它能刚好
阅读全文
摘要:田忌赛马,经典的贪心,不过很难想到呀,每次都用最快跟最快的,最慢的跟最慢的进行比较、判断1)若田最快的比王最快的慢,则用最慢的跟王最快的比,输掉一局;反之,则赢了当然是最划算的选择了2)若田最慢的比王最慢的还慢,则用最慢的跟王最快的比,输掉一局;反之,同上。这俩步是贪心所在;还有就是注意想等到情况……看代码吧#include<stdio.h>#include<stdlib.h>int cmp(const void *a,const void *b){ return *(int*)a-*(int*)b;}int main(){ int s[1001],t[1001],n;
阅读全文
摘要:很明显,要计算出搬桌子的最短时间,就是算出最多重叠的时间段有多少,计算重叠的区间的最多的个数,相当于计算数轴上某一个点被堆叠的最多的次数,所以接下来就好理解了看代码……#include <iostream> using namespace std; int main() { int t,i,j,N,P[200]; int s,d,temp,k,min; cin>>t; for(i=0;i<t;i++) { for(j=0;j<200;j++) P[j]=0; cin>>N; for(j=0;j<N;j++) { cin>>s&g
阅读全文
摘要:黑书中的经典题:枚举+贪心把每钓5分钟鱼称为钓一次鱼。首先枚举John需要走过的池塘的数目X,即从池塘1走到池塘X。减去路上花去的时间T=sum(Ti) i=1...X-1,这样我们可以认为John能从一个池塘"瞬间转移"到另一个池塘,即在任意一个时刻都可以在池塘1到池塘X中任选一个钓一次鱼(很重要)。现在采用贪心策略,每次选择鱼最多的池塘钓一次鱼。对于每个池塘来说,由于在任何时候鱼的数目只和John在该池塘里钓鱼的次数有关,和钓鱼的总次数无关,所以这个策略是最优的。假设一共允许钓k次鱼,那么每次在N个池塘中选择鱼最多的一个钓。总的时间复杂度为O(kn^2)。(黑书中的解释
阅读全文

浙公网安备 33010602011771号