摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=2795题意:有一块尺寸为h*w的矩形长板,要在上面贴1*wi的海报n张,选择贴海报的位置是:尽量高,同一高度,选择尽量靠左的地方。要求输出每张海报的高度位置。思路:用线段树来做。在结构体中有一个num变量,装每段区间剩余的最大长度,然后与输入进来的长度len比较,根据题意应该先是左边比较,再是右边比较。还有,就是最多只有200000个点,但是要是高小于200000,那么就应该用高来建树,因为200000个点,其高度最多为200000.......反思:此题用线段树来做的最大好处是,它是用最底层的单个结点(也就 阅读全文
摘要:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394题意:就是给出一串数,当依次在将第一个数变为最后一个数的过程中,要你求它的最小逆序数。思路:可以用树状数组和线段数做。这里我是用线段树做的。建的是一棵空树,然后每插入一个点之前,统计大于这个数的有多少个,直到所有的数都插入完成,就结果了逆序树的统计。要得出答案主要是利用了一个结论,如果是0到n的排列,那么如果把第一个数放到最后,对于这个数列,逆序数是减少a[i],而增加n-1-a[i]的.当然,你也可以是统计小于这个数的有多少个,然后再用已经插入树中i个元素减去小于这个数的个数,得出的结果也是在一 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=1710题意:依次给出二叉树的前序历遍和中序历遍,要你输出它的后序历遍。感叹:这个题目,我不得不感慨用递归解决二叉树的问题真心碉堡了。也不得不感叹,自己还是太水了,记得以前我的一个学长做这个题目,没超过十分钟后就ac了。思路:用递归做的宏观思路很简单,就是结合前序历遍和中序历遍,找根节点,在中序历遍中,根节点左边的全部是左子树,右边的全部是右子树,那么将这些结点慢慢划分为一个个子问题。左子树的第一个结点又可以看作一个新的根节点,它有它的左子树和右子树,同理,慢慢划分,递归的思路也就出来了。假如中序历遍中第i个点 阅读全文
摘要:
思路:用优先队列模拟最小化堆的操作,然后用建二叉树的方法将结点连接好。#include<iostream>#include<algorithm>#include<queue>using namespace std;typedef struct tree{ tree *l,*r; int w; char ch;}tree;struct ss //优先队列,模拟最小化堆,它其中变量的类型为struct tree *型{ friend bool operator<(const ss &a,const ss &b) ... 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=2527题意:建完树后,判断下除了叶子结点之外的其他结点之和是否大于题目给出的数字。思路:如果了解哈夫曼树,就会知道,它是拿出一串数中两个权值最小的,合成一个新的,再将这个新形成的加入到那个串中,再操作.......这样,就可以用优先队列来模拟建哈夫曼树的过程,从而ac此题。注意:此题有坑,被它弄wa了2次,就是当它有n个a时,也要判断.......例如:45aaaaayes5aaaaaano#include<iostream>#include<queue>using namespace 阅读全文
摘要:
1、在用树状数组的时候,有些时候写得快了,忘了将数组全部置0//memset(c,0,sizeof(c));2、在做题时,没有完全针对题目设置n值,导致有些题目出错。3、在做成段更新,单点求值的题目时,不怎么熟练。 阅读全文
摘要:
http://acm.hdu.edu.cn/discuss/problem/post/new.php?problemid=4006思路:一开始我是想自己编一个最小堆来实现的,回来想了想,还是直接用优先队列吧。因为要第k大,在一个测试中k值是固定的,所以,我只要保留前k大的数,然后输出最小的那个数就可以了。#include<iostream>#include<queue>using namespace std;struct ss{ friend bool operator<(const ss a,const ss b) { if(a.v>b.v) return 阅读全文
摘要:
#include<iostream>using namespace std;typedef struct tree{ tree *l,*r; int num;}tree;tree *creat(int x) //建树{ tree *t=(tree *)malloc(sizeof(tree)); t->l=0; t->r=0; t->num=x; return t;}tree *inster(tree *s,int x) //插入结点{ if(s==NULL) { tree *... 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=3791思路:建好二叉搜索树后,用二叉树的历遍去判断就好#include<iostream>#include<cstring>using namespace std;typedef struct tree{ tree *r,*l; int num;}tree;tree *root;int a[30],b[30],count=0;tree *creat(int x){ tree *t=(tree *)malloc(sizeof(tree)); t->r=0; t->l=0; t 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=4414题意:找有多少个十字架,十字架周围不能有#。思路:用简单暴力就可以过。反思:这个题目做了很久,wa了4次。第一次写的代码中有两个错误,一是没有判断十字架自己最中心的那个是不是为#,而是没有排除到了最末位时,o与#这组数据#include<iostream>#include<string.h>using namespace std;char s[60][60];int n;int main(){ while(scanf("%d",&n)>0) { 阅读全文