09 2011 档案

摘要:hdu 2522 A simple problem除法的本质,模拟除法的过程即可;中间用一个数组保存出现过的余数,若同一个余数出现俩次,则出现了循环节;考虑可能出现负数;#include<stdio.h>#include<string.h>int f[100000];int hash[100000];int main(){ int t,m,y,cnt,n,i; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n<0) { printf("-" 阅读全文
posted @ 2011-09-24 00:42 枕边梦 阅读(260) 评论(0) 推荐(1)
摘要:hdu 1556 Color the ball中文的题目,题意就不说了用线段树做了,不过有不用线段树的方法,不过我解释不来贴代码吧#include<iostream>#define MAXN 100010using namespace std;int p[MAXN<<2];void insert(int k,int s,int t,int l,int r){ if(l<=s && t<=r) { p[k]++; return ; } int kl=k<<1,kr=kl+1,mid=(s+t)>>1; if(l<= 阅读全文
posted @ 2011-09-24 00:31 枕边梦 阅读(230) 评论(0) 推荐(0)
摘要:pku 3667 Hotel题意:去掉题目背景,就是给你一个[1,n]的区间,初始时,整个区间为空,在区间进行俩个操作:1) 输入 1 D :在区间上从左到右找出第一个连续的长度为D 的空间,并将该区间填满,输出区间的端点,若不存在,输出02) 输入 2a b: 将区间[a,a+b-1] 填满分析:很明显是用线段树进行维护,关键是每一个节点需要保存该区间的些什么值?这里我们可以想到,因为要找出的是一个连续的空区间的左端点,这个区间可能分布在左儿子上,右儿子上,或者可能在俩边都有,这样给查询带来了极大的不方便。不过,我们可以充分利用线段树的结构特点,通过保存与区间左右端点有关的信息,就可以遍历整 阅读全文
posted @ 2011-09-23 09:56 枕边梦 阅读(381) 评论(0) 推荐(0)
摘要:hdu 2795 Billboard题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子思路:总共有h个叶节点,表示有h个区间,线段树的一个域表示该区间还能容纳的最大物品,每次找到最大值的位子(先找左边),然后减去L线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了)#include<iostream>#include<algorithm>#define MAXN 222222using namespace std;int p[MAXN*4];int query(int k,int x,int s,int t){ 阅读全文
posted @ 2011-09-22 17:59 枕边梦 阅读(136) 评论(0) 推荐(0)
摘要:pku 1436 Horizontally Visible Segments题意:在水平坐标系内,有n条垂直线段,问任意三条线段组成一组,问有多少组线段满足,其中任意俩条线段水平可见。水平可见满足:存在一条水平线段将俩条线段连接起来,并且中间不与其他任意线段有交点分析:这是一个染色的问题。首先将线段按横坐标进行排序,接着,从左往右判断当前线段与左边的线段是否水平可见。问题转换:将线段的编号理解为该线段的颜色,那么判断该线段与前面已经插入的线段是否水平可见,只需在查询过程中判断与该区间相交的区间是否存在整个被染成某一种颜色,如果是,则该区间的颜色标号代表的线段与当前线段水平可见。这里要注意查询与 阅读全文
posted @ 2011-09-22 11:46 枕边梦 阅读(297) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4012下面分析转自大牛:http://www.cnblogs.com/ambition/archive/2011/09/08/Paint_on_a_Wall.html题目大意:给出一个2×n的矩阵(n<=8),每次给一个矩形染色,之后的染色覆盖以前的颜色,问到达目标状态需要多少次看到题目数据量想到了要用搜索去做,想了很久才想出搜索方法,搜索题中的极品啊~~因为每一次涂色肯定会有至少一块颜色是最终显示的颜色,所以用状态记录每一块是否是最终显示的颜色,因为只有2×8块,用二进制 阅读全文
posted @ 2011-09-20 19:56 枕边梦 阅读(503) 评论(0) 推荐(0)
摘要:为什么这样就过了,比赛的时候怎么改都WA了,我只不过把条件改得更严格一点,把多余的判断去掉而已;hdu 4046 Panda题意:给你一个字符串,由'w'和 'b' 组成,对该字符串有俩个操作,当输入为0时,询问该区间[a,b] 内有多少个串 为 "wbw";当输入为0时,将下标为k的字符改为输入的字符;注意:这里的a,b,k表示的都是字符串的下标,也就是取值范围为[0,n-1];分析:对这种区间修改或询问的题目,首先想到的就是线段树或者树状数组了,不过还是线段树熟悉一点,我用线段树做的 ,关键还是构造模型,区间内每一个点的值表示的是什么?我 阅读全文
posted @ 2011-09-19 15:13 枕边梦 阅读(370) 评论(0) 推荐(0)
摘要:hdu 4041 Eliminate Witches!题意:去掉题目背景,给你一个串,转化为一棵树,输出先序遍历节点的顺序;分析:整个串由节点名字,'('、')'、',' 组成,遇到一个括号时,当前左括号是当前括号内节点的父节点,括号内用','隔开的是兄弟节点,整体就是一颗树;若要将该串转化为树,再进行一次DFS的话,我想应该会超时吧。所以第一感觉就是用栈模拟整个串来遍历该树,用队列来保存遍历节点的顺序,用数组应该会更快吧,不过不知道大概会有多大,所以就偷一下懒,直接用队列了。队列是用来保存遍历节点的顺序的,而栈保存的是当前遍历到 阅读全文
posted @ 2011-09-19 14:33 枕边梦 阅读(449) 评论(0) 推荐(0)
摘要:Problem Description反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数。现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大。Input第一行输入n,接下来n行测试数据输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].Output输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.Sample Input32 31 1047 359Sample Output26240Hint2的因子为:1 210的因子为:1 2 5 10N只有 阅读全文
posted @ 2011-09-17 14:29 枕边梦 阅读(283) 评论(0) 推荐(0)
摘要:pku2886 Who Gets the Most Candies?题意: 有一排编号为1~N的小孩顺时针围成圈,每人手上有一张编号为a[i]的卡片,游戏从第K个小孩开始,他亮出自己的卡片数字,若a[i]大于0,那么左数第a[i]个小孩出圈,否则右数第a[i]个小孩出圈,游戏一直进行,知道所有孩子都出圈,第p个出圈的将会得到f(p)个糖果,f(p)表示p的因子数,问谁拿到的最多的糖果。分析:其实我是先知道 了用线段树做,才拼命想该用线段树怎么做的。思路大致是这样的:每次都默认是从剩下的第一个开始数,顺时针让第count个人出圈。所以必须在每一个人出圈时,算出他左边有多少,再通过他手上的卡片值a 阅读全文
posted @ 2011-09-17 13:55 枕边梦 阅读(258) 评论(0) 推荐(0)
摘要:pku 2828 Buy Tickets题意:给定N(1<=N<=200000)个整数对(pos,val),表示在pos右边 的位置插入一个值val,求经过N次操作之后的val序列的排序情况分析:经典的逆推问题,倘若按照题目给你的顺序进行序列的维护操作,TLE是肯定的。这时,需要注意到,最后一个插入的值位置的固定的,也就是最后一个插入的值可以在它想要插入的位置,所以,先保存所以整数对,之后在倒序插入序列中。那到底应该用什么数据结构实现呢?这里我们发现,可以用线段树来解决这一问题,每一个区间添加一个域 num,表示该区间还能放置的位置数,或者说,表示该区间还能放置的最大的序号值(当然 阅读全文
posted @ 2011-09-16 09:54 枕边梦 阅读(274) 评论(0) 推荐(0)
摘要: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最不利,后者 阅读全文
posted @ 2011-09-15 20:49 枕边梦 阅读(489) 评论(4) 推荐(1)
摘要:原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4016题意:从给出的N个数中,选出K个数进行与运算,求出最小值一看到这题目,哎,就知道暴力是绝对超时的,可是之后,就没之后……………………看了网上的思路,这剪枝太有技巧了,orz思路如下:1.从当前值开始,如果选上剩下的所有,也不能小于已得最优值的话,返回。2.最优值不用等到累积选到k数才更新,而是不断更新,因为与运算结果比原来两个都小,所以这也是一个剪枝。3.预处理,从小到大排序,可想而知,先选小的,得到的最优值更接近于结果,是个强剪枝,没有这个2900ms+,加上600ms+。太强大了原文的链接 阅读全文
posted @ 2011-09-14 22:59 枕边梦 阅读(513) 评论(0) 推荐(0)
摘要:题意:将题目的背景去掉,简单的说,就是每一次对一个区间的所有值都分别做一次求平方根的运算,就是将那个值改为它的平方根的值,每次再询问一段区间内的总和分析:很明显的用线段树来做,不过明显的对线段树还是不熟悉,一开始将每一步update操作都更新到具体的每一个点了,没有任何技巧,直接TLE;很明显,如果每一步都必须更新的具体每一个点的话,就是一个O(n)复杂度的操作了,这个对使用线段树来说,没太大意义了。这题目而言,我们发现,任何一个2^63次方以内的数,开根号都至多开八次,也就是,多次询问操作之后,很多都已经不需要update了,所以,只需要在每一个节点中增加一个域,用来标记该区间是否已经全部更 阅读全文
posted @ 2011-09-14 20:49 枕边梦 阅读(288) 评论(0) 推荐(0)
摘要:hdu 4036 Rolling Hongshu题意:一个sweet potato想要去约会,从起点滚到终点,途经一个mountain,有m个峰顶,第一个峰顶,第m个峰顶分别为起点和终点,忽略摩擦力,在每一个斜坡上分布着bitter potatoes,每经过一个bitter potato,bitter potato就会以一定的初速度追赶sweet potato,问,sweet potato应该以最小多大的初速度滚动,保证不被bitter potato追到,完成约会;分析:根据能量守恒定律,首先,求出sweet potato到达每一个峰顶需要的最小速度,其次,求出sweet potato到达每一 阅读全文
posted @ 2011-09-12 14:50 枕边梦 阅读(383) 评论(0) 推荐(0)
摘要:hdu 4039 The Social Network题意:给出N对好友关系,之后Q次提问,问可以对该用户推荐的相识度最高的好友;推荐好友满足的条件:该用户的所有好友的好友中,出现次数最多的,而且推荐好友本身不是该用户的好友;若有多个推荐好友时,按字典序输出;分析:嘿嘿,我的做法有点暴力,600+ms;首先对所有用户的名字(字符串)标号,好处理一些,这里用了字典树实现了;接下来,用邻接矩阵表示任意俩个用户直接的关系,再者,对与每一次询问,遍历该用户所有好友的好友,找出出现次数最多的;最后,若有多个推荐好友时,要字典树输出,额,我用优先队列做了,重载操作符,之后直接丢进去,再输出就可以了View 阅读全文
posted @ 2011-09-12 12:04 枕边梦 阅读(587) 评论(0) 推荐(0)
摘要:题目大概意思:给定一个图,任意俩点间的最短路已知,判断该图是否存在,若不存在,则输出impossible,存在,输出可能的最少边数分析:首先,判断该图是否存在,这个很容易,对已给的图求出任意点的最短路,若存在俩点最短路与原图不同(即所给图存在更短路),则不存在;若该图存在,求出最少的边数,其实就是一个删边的过程,起始的边数是n*(n-1),若俩点之间存在其他路径长等于直接相连时的路径长,则删去,注意,要判断是否重复删边(orz,这里WA了几次);求任意俩点之间的最短路,用floyd算法,复杂度O(n^3),因为n最大为100,无压力~~View Code #include<iostrea 阅读全文
posted @ 2011-09-12 11:46 枕边梦 阅读(239) 评论(0) 推荐(0)
摘要:题目大意:在二维平面上,给一些点。有两个操作:给一个d,把所有x为d的点去掉,或把所有y为d的点去掉,问每次去掉的点。我的思路:先将横纵坐标都离散化(大部分时间都花在这个上面吧),然后直接把出现过的点(离散过的点)累计,每次询问之后就可以直接输出了,之后再维护一下,把对应的x或y的累计值 减1==! 很浅显的思路我的代码:600+msView Code #include<iostream>#include<map>using namespace std;map<int,int> mapx;map<int,int> mapy;map<int, 阅读全文
posted @ 2011-09-11 03:01 枕边梦 阅读(359) 评论(0) 推荐(0)
摘要:题目链接:hdu2050折线分割平面题意:求n条折线分割平面的最大数目.分析:我们不忙着解这道题。我们先来看一下N条相交的直线最多能把平面分割成几块很明显,当添加第n条直线时,为了使平面最多,则第n条直线要与前面n-1条直线都相交,切没有任何三条线交于一个点。这样,第n条直线一共有n-1个交点。我们知道,增加n个焦点,则增加n+1个平面。所以n条直线分割平面最大数是1 + 1 + 2 + 3 + ... + n = (n2 + n + 2) / 2 熟悉了线分割平面,现在,我们再来看看,每次增加的不是一条直线,而是两条相互平行的线,那又如何呢?当第N次添加时,前面已经有2N-2条直线了,按我们 阅读全文
posted @ 2011-09-09 09:03 枕边梦 阅读(257) 评论(0) 推荐(0)
摘要:hdu 1131 Count the Trees Catalan数的组合公式为 Cn=C(2n,n) / (n+1);此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)卡特兰数的一个应用:给顶节点组成二叉树的问题。 给定N个节点,能构成多少种不同的二叉树? (能构成h(N)个)但因为每一个节点都被命名了,也就是每一个节点都当做 是不同的,所以最后每一个卡特兰数都要乘以n!用组合公式化简得:h(n)=(2n)!/(n+1)! = 2n*(2n-1)* …… *(n+2)。#include<iostream>using namespace std;#defi 阅读全文
posted @ 2011-09-09 08:47 枕边梦 阅读(326) 评论(0) 推荐(0)
摘要:转帖自 http://xuyemin520.is-programmer.com/posts/26317.html还有 http://hi.baidu.com/a363310925/blog/item/aced542d719b2b5d4fc22695.html题意:M+N个人排队买票,票的单价是50¥,每个人只能买一张。 M个人拿50的去买,N个人拿100的去买,然后悲剧的是售票处开始的时候没有钱,所以如果拿100块买票人前面的拿50块买票的人小于或者等于用100块买票的人,这种排队方式就不合法,也就是不能顺利全部都买到票(因为没零钱找了)!卡特兰数的应用该题的公式:(C(m+n, n)-C(m 阅读全文
posted @ 2011-09-08 22:28 枕边梦 阅读(236) 评论(0) 推荐(0)
摘要:hdu 1267 下沙的沙子有几粒?参考自大牛http://www.wutianqi.com/?p=2642分析,这题其实是H和D的组合排列问题,只不过要考虑期间累计的H和D的数量关系。用DP来做,可以推导出:dp[i][j] = dp[i-1][j] + dp[i][j-1]dp[][]前一个表示H的数量,后一个表示D的数量。分上面那种情况是因为最后一个必然是H或者D,而此时可以考虑把新加的一个放在最后,因为假如加的是H,如果加在[i-1][j]中加入H,则最后一个依然是H或D,此时如果成立,那么依然属于[i-1][j]或[i][j-1]的情况。所以推导出此递推关系。#include< 阅读全文
posted @ 2011-09-08 20:25 枕边梦 阅读(214) 评论(0) 推荐(0)
摘要:嘿嘿,转帖的代码,感觉简单明了大数乘法来的,不过要注意的问题还真多#include <stdio.h>#include <string.h>void times(char *a,char *b,char *t) //大数乘法,a和b相乘,结果赋给t{ int len_a=strlen(a),len_b=strlen(b); int c[10]={0},d[200]={0},e[200]={0}; for(int i=0;i<len_a;i++) c[i]=a[len_a-1-i]-'0'; for(int i=0;i<len_b;i++) d 阅读全文
posted @ 2011-09-08 15:15 枕边梦 阅读(199) 评论(0) 推荐(0)
摘要:hdu 1997汉诺塔题目分析:转自:http://lcc3536.blog.163.com/blog/static/132469917201132283640123/1) 最初我们要判断一下是不是已经完全放好了,这样就不用考虑是不是最优化了, 因为都已经放好了,肯定是最合法的! 或者说全部在 A 上,这是还没开始动作的一个状态,所以也是合法的!2) 否则我们 要对每次状态的最大的那个进行判断,因为我们知道,汉诺塔最大的那个不可能停在 B 上,(假设 最初的时候都在 A 上,要移到 C 上去!),只可能在 A 或者 C 上面!如果是放在 B 上面,停止判断,直接断定他非法~这样我们得出了第二个 阅读全文
posted @ 2011-09-08 11:41 枕边梦 阅读(1026) 评论(0) 推荐(0)
摘要:看得迷迷糊糊,还是一知半解啊…………转帖:http://blog.sina.com.cn/s/blog_59e67e2c0100a7yx.html首先引用下leemars的报告:这道题要求N!的最后一个非0数字是多少,如果用一般作法,先统计2和5的个数,然后补乘2,得到的将是TLE。所以还需要再做简化:为了把0去掉,我们把所有的因数2和5都提出来,放到最后再处理。N!中的N个相乘的数可以分成两堆:奇数和偶数。偶数相乘可以写成(2^M)*(M!),M=N DIV 2。M!可以递归处理,因此现在只需讨论奇数相乘。考虑1*3*5*7*9*11*13*15*17* ... *N(如果N为偶数则是N-1 阅读全文
posted @ 2011-09-07 22:38 枕边梦 阅读(310) 评论(0) 推荐(0)
摘要:转自http://xuyemin520.is-programmer.com/posts/26265.html题目:就是给你N个房间,然后每个房间1把钥匙,你最初手里没有任何钥匙,要靠破门而入!这里只有第一个房间不能破门进去,其他都可以,给你房间数N,和最多能破门的个数,让你求能全部把房间打开的概率!题目分析:又是是我的第一次啊!受教育了?有木有?这种题目是斯特林第一类数的应用,虽然很裸,但是很经典啊 !首先这题其实让我们求的是给 N个元素,让我们求K个环排列的 方法数。斯特林第一类数的第推公式:S(N,0)=0;S(N,N)=1;S(0,0)=0;S(N,K)=S(N-1,K-1)+S(N-1 阅读全文
posted @ 2011-09-07 21:35 枕边梦 阅读(1619) 评论(0) 推荐(0)
摘要:若输入A 战胜 B时,就让B指向A。最后,指向空的就说明没有人战胜过他。如果这样的人只存在一个,那他就是冠军了。 名字的映射用map实现,出现过的名字用set保存#include <set>#include <map>#include <string>#include <iostream>using namespace std;int main(void){ int n, i, t; string b, e; set <string> s; set <string>::iterator it; map <string 阅读全文
posted @ 2011-09-07 16:26 枕边梦 阅读(203) 评论(0) 推荐(0)
摘要:原文链接为http://hxraid.iteye.com/blog/647759从《基于比较的排序结构总结 》中我们知道:全依赖“比较”操作的排序算法时间复杂度的一个下界O(N*logN)。但确实存在更快的算法。这些算法并不是不用“比较”操作,也不是想办法将比较操作的次数减少到 logN。而是利用对待排数据的某些限定性假设 ,来避免绝大多数的“比较”操作。桶排序就是这样的原理。桶排序的基本思想 假设有一组长度为N的待排关键字序列K[1....n]。首先将这个序列划分成M个的子区间(桶) 。然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字... 阅读全文
posted @ 2011-09-06 22:36 枕边梦 阅读(411) 评论(0) 推荐(0)
摘要:其实,说得简单明了的一点,就是求俩个分数的最小公倍数;方法:先将俩个分数转换成最简形式,在求出俩个分母的最大公约数最为最小公倍数的分母,求出俩个分子的最小公倍数做为最小公倍数的分子即可;当我把我的代码改得面目全非的时候,我才发现了我WA的原因,求最小公倍数的时候int lcd(int u,int v,int h){ return(u*v/h);//这步溢出了}应该改为int lcd(int u,int v,int h){ return(u/h*v);}#include<iostream>using namespace std;int n;int hcf(int a,int b){ 阅读全文
posted @ 2011-09-06 19:54 枕边梦 阅读(347) 评论(0) 推荐(1)
摘要:题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1568我的天呐,写了那么久的代码,拼命地想省内存,可是还是没用呀,那么大一个数,数组至少就要那么大了呀,看看我那MLE的代码吧,原因是我用了递推公式,下面一个是直接用公式计算每一个的MLE的代码#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>using namespace std;int sum[2][200];int 阅读全文
posted @ 2011-09-06 17:51 枕边梦 阅读(214) 评论(0) 推荐(0)
摘要:先看下资料,数学公式来的资料转自:http://jackiesteed.blog.163.com/blog/static/165506750201051552930758/约瑟夫环问题是一道经典的数据结构题目问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。一般我们采用一个循环队列来模拟约瑟夫环的求解过程,但是如果n比较大的时候,采用模拟的方式求解,需要大量的时间来模拟退出的过程,而且由于需要占用大量的内存空间来模拟队列中的n个人,并不是一个很好的解法。在大部分情况下,我们仅仅需要知道最后那个人的编号,而不是要来模拟一个这样的 阅读全文
posted @ 2011-09-06 15:21 枕边梦 阅读(603) 评论(0) 推荐(0)
摘要:经典的统计题目题意:给出N个人的坐标,求出在以r为边的正方形中最多的人数分析:因为正方形的位置并未固定,而要满足覆盖最多的点,则以某一个点的y坐标作为下边界一定有最优解,所有:首先对N个人的纵坐标进行排序,枚举所有Y坐标(正方形下边界),找出满足以当前y坐标为下边界的正方形内的点,再枚举满足条件的点X坐标,计算以r为边最多可覆盖的点,总复杂度O(n^2)代码:#include<iostream>#include<algorithm>using namespace std;struct node{ int x,y;}p[1001];int n,ans,r,xx[1001] 阅读全文
posted @ 2011-09-06 12:55 枕边梦 阅读(395) 评论(1) 推荐(0)
摘要:公式:p+q-GCD(q,p)具体分析:http://www.shuxueweb.com/shuxuebolan/qiuti/shuxuebolan_9112.html#include<iostream>using namespace std;int hcf(int a,int b){ int r=0; while(b!=0) { r=a%b; a=b; b=r; } return(a);} int main(){ int q,p; while(cin>>q>>p) { cout<<q+p-hcf(q,p... 阅读全文
posted @ 2011-09-05 20:33 枕边梦 阅读(214) 评论(0) 推荐(0)
摘要:(1)纯循环小数(仅指整数部分为0的)化成分数时,分数的分母由9组成,9的个数等于一个循环节的位数,分子是由一个循环节的各位数字组成。如:0,234234234....=234/9990.111111=1/9 (2)非纯循环小数化成分数时,分母由9和0组成,其中9的个数等于一个循环节的位数,0的个数等于非循环部分的位数。分子是从小数点后的第一位到第一个循环节的末位组成的数减去非循环部分。如:0,76345345345。。。。=(76345-76)/99900 0.0243434343.........=(243-2)/9900 0.811111。。。。=(81-8)/90=73/90#incl 阅读全文
posted @ 2011-09-05 19:59 枕边梦 阅读(384) 评论(0) 推荐(0)
摘要:题意:小孩子玩积木堆房子的情景:每组测试数据第一行给出n,代表接下来有n块砖;接下来n行,每行给出砖的长,宽,高,属性(a,b,c,d);属性d:d=0:该砖的长度和宽度(a,b)要比垫在他下面的砖的长,广大或者相等;就是长>=长,宽>=宽d=1:改砖的宽度和长度要比下面的砖的长度大或者相等,同时,该砖的宽度值和面积值要比下面的砖的面积值大;即长>=长,宽>=宽,面积>面积。也就是长>=长&&宽>=宽&&(长>长||宽>宽)d=2:该砖的长度和宽度(a,b)要比垫在他下面的砖的长,广大(严格大于);长> 阅读全文
posted @ 2011-09-05 18:35 枕边梦 阅读(410) 评论(0) 推荐(0)
摘要:The Frog's Games 二分枚举答案View Code #include<iostream>#include<algorithm>using namespace std;int L,n,m;int a[500002];int cmp(const void *c ,const void *b ) { return *(int *)c - *(int *)b; } int main(){ while(scanf("%d %d %d",&L,&n,&m)==3) { int maxn=0; for(int i=1; 阅读全文
posted @ 2011-09-04 22:35 枕边梦 阅读(255) 评论(0) 推荐(0)
摘要:题目大意:向一个容量为V的洞中搬物品 每件物品有一个停放体积 可一个移动体积 问能否放下这些物品解题思路:对这些物品进行排序 按照顺序依次进入洞中 排序要尽可能使得所有的东西都能进入洞中这是一个贪心的问题 停放体积 移动体积 第一件物品 a1 b1 第二件物品 a2 b2假设这两件物品的移动体积都不大于洞的体积V那么将单独比较两个物品的时候会发现 a1+b2为先放第一件物品 后放第二件物品的最大瞬时体积 a2+b1为先放第二件... 阅读全文
posted @ 2011-09-04 16:31 枕边梦 阅读(221) 评论(0) 推荐(0)
摘要:感觉这俩个博客真的解释的太好了,今天有点恍然大悟的感觉http://cuitianyi.com/blog/%E6%B1%82%E6%9C%80%E5%A4%A7%E6%9D%83%E4%BA%8C%E5%88%86%E5%8C%B9%E9%85%8D%E7%9A%84km%E7%AE%97%E6%B3%95/http://www.byvoid.com/blog/match-km/最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大。解决这个问题可以用KM算法。理解KM算法需要首先理解“可行顶标”的概念。可行顶标是指关于二分图两边的每个点的一个值lx[i]或ly[ 阅读全文
posted @ 2011-09-04 09:26 枕边梦 阅读(464) 评论(0) 推荐(0)
摘要:模板题来的,构完图之后就是直接的模板了,可惜对于这个算法还是了解的不够深…………若求得的是最大匹配,则将权值为正,若为最小匹配,则将权值该为相反数此模板默认所有数组默认下标从1 开始,复杂度O(n^3)mat 表示邻接矩阵,nx,ny表示二分的大小lx,ly表示为顶标,fx[i],fy[i]标记十分访问过该点mx[i],my[i] 表示匹配先贴模板:KM算法模板#include <iostream>using namespace std;const int MAXN = 110;const int INF = 0x7FFFFFFF;int nx, ny, w[MAXN][MAXN] 阅读全文
posted @ 2011-09-03 23:29 枕边梦 阅读(258) 评论(0) 推荐(0)
摘要:题意:给定N张幻灯片的maxx,minx,maxy,miny,和N个点的位置,表示幻灯片的编号,编号写在幻灯片上,问幻灯片与编号形成的最大匹配能否确定唯一的匹配,输出已确定的唯一匹配;分析:若编号与幻灯片满足 minx<x<maxx, miny<y<maxy,则形成一个可能的匹配,求出最大匹配(肯定是完美匹配的)之后,再依次判定该匹配边是否为必须边判定方法:先将该匹配边删除,判定从该点出发是否存在增广路径,若存在,则不是必须边,反之,为必须边;#include<iostream>using namespace std;bool mat[26][26],vis 阅读全文
posted @ 2011-09-02 09:36 枕边梦 阅读(310) 评论(2) 推荐(0)
摘要:几道简单的关于素数的题目,嘿嘿,基本都是用了筛选法pku3006#include<iostream>#include<math.h>#define MAXN 1000001using namespace std;bool prime[MAXN];void init(){ prime[1]=false; prime[2]=true; for(int i=3; i<MAXN; i++) if(i%2) prime[i]=true; else prime[i]=false; for(int i=3; i<=sqrt((double)MAXN); i++) ... 阅读全文
posted @ 2011-09-02 09:19 枕边梦 阅读(180) 评论(0) 推荐(0)