随笔分类 -  数据结构

摘要:/*题目: 模拟排队的实现,但是若是有同伙的话,这些家伙就会插队,排到他们的同伙的后面,要不就乖乖地排到队伍的后面。现在给出朋友关系以及进队出队的顺序,问你当出队时是谁在出队分析: 利用优先队列,重载小于号,使得优先级最大的先出队,优先级的定义如下:当前面有同伙时,按照前面的同伙的优先级来插入,若没有的话,就按照现在的优先插入。当优先级相同时,按照先进队的优先级越大就越大。*/#include <iostream>#include <cstdio>#include <queue>#include <cstring>using namespace 阅读全文
posted @ 2012-07-25 12:47 yejinru 阅读(234) 评论(0) 推荐(0) 编辑
摘要:/*用结构体数组模拟栈,结构体中保存当前min与max的值*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int X = 65537;int n,top;struct node{ int max,min;}stack[X];int main(){ freopen("sum.in","r",stdin); char s[10]; int x; int ncase = 0; while(cin>> 阅读全文
posted @ 2012-07-25 12:44 yejinru 阅读(206) 评论(0) 推荐(0) 编辑
摘要:/*题目: n个人中有m对人互为朋友,若a认识b,b认识c,则a认识c,问这n个人中最多有多少人 相互认识分析: 并查集实现,把互为朋友的放置在同一集合中,询问最大人数时可以使用计数器计算该 人所在集合的父节点的数字*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int X = 30002;int p[X],cnt[X],n,m;int find_set(int x){ if(x!=p[x]) p[x] = find_set(p[x])... 阅读全文
posted @ 2012-06-14 21:53 yejinru 阅读(274) 评论(0) 推荐(0) 编辑
摘要:/*题目: 给出序列,其中一个子序列为(x,y,z),问最多有多少个这样的子序列, 使得x<z<y,其中该序列为1到n的排列分析: 由于是排列,所以不存在相同的元素,所以x,y,z互不相等。所以序列中 的大小关系可表示为 小中大+小大中 = 小__ __ ,所以答案 小大中 = 小__ __ -小中大 统计 小__ __可以统计该位后面的所有元素中比他大的个数为x,则 小__ __ = x*(x-1)/2 而统计小中大时,只需要统计前面比他小的以及后面比他大的个数x,y,则 小中大 = x*y 统计个数可以用树状数组... 阅读全文
posted @ 2012-06-14 12:08 yejinru 阅读(193) 评论(0) 推荐(0) 编辑
摘要:题目: 每两人比赛需要裁判(第三名比赛队员充当),并且裁判的等级在两者之间,并且裁判需要在那两名选手的位置之间,问可以安排多少场这样的比赛。分析: 树状数组枚举裁判,分别求到左边位置比该队员的等级高的和等级低的选手数目,当求完之后再从左到右分别删除该项后,求到比他等级高的和等级小的,删除操作只需要modify操作时减掉1即可实现。然后根据乘法原理可知用左边的等级高的*右边等级低的+右边等级高的*左边等级低的。#include <iostream>#include <cstdio>#include <cstring>using namespace std;co 阅读全文
posted @ 2012-05-25 09:38 yejinru 阅读(290) 评论(0) 推荐(0) 编辑
摘要:/*trie树建立,然后递归打印所有的电话号码(统计次数大于1的打印出来),内存在HOJ上爆了,应该是递归时爆栈了。。。第二个代码两个都是可以AC的,要注意POJ上是只输入一个案例,HOJ上输入多个样例39268K938MS第二个14232K891MS*/#include <cstdio>#include <cstring>#include <iostream>using namespace std;#define X 125char s[X];int n;struct trie{ int id; trie *p[10]; char s[X]; trie() 阅读全文
posted @ 2012-05-07 10:34 yejinru 阅读(217) 评论(0) 推荐(1) 编辑
摘要:/*题目: 星星有等级,每颗星星的等级划分为在它下方(坐标轴上)有多少颗星星即为多少等级分析: 由于先输入的是x坐标,而y坐标已经是按照由小到大输入的,所以可以用树状数组来求和的形式 来求出该行星的等级。*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 40005int c[X],ans[X],n;int lowbit(int x){ return x & -x;}void modify(int x){ while(x<X) 阅读全文
posted @ 2012-04-30 22:18 yejinru 阅读(229) 评论(0) 推荐(0) 编辑
摘要://ACM ICPC Central European Regional 1997/*简单的栈的应用,可惜WA了好几次poj上要把最后的while后的cout<<endl;去掉*/#include <iostream>#include <stack>#include <cstdio>using namespace std;const int X = 1005;int a[X],b[X];int main(){ freopen("sum.in","r",stdin); freopen("sum.ou 阅读全文
posted @ 2012-03-23 19:15 yejinru 阅读(253) 评论(0) 推荐(0) 编辑
摘要:/*(x1,y2) ____________ (x2,y2) | | | | | | |____________|(x1,y1) (x2,y1)在上面的矩形中,本题用树状数组来计算的,所以sum(x2,y2)计算的是它的左下方所有的手机用户数,但是它多算了sum(x2,y1)以下的以及sum(x1,y2)以下的,若减掉即ans = sum(x2,y2) - sum(x2,y1) -sum(x1,y2)的话,又减多了sum(x1,y1)部分,那只好加上这一部分了。另外,在update(),sum()时,无非算多了一维,很容易理解的,具体看代码,新学到了 i -... 阅读全文
posted @ 2012-03-22 21:11 yejinru 阅读(228) 评论(0) 推荐(0) 编辑
摘要:/*题目: 是说学生0怀疑有SARS病,跟他接触过的俱乐部的所有人以及他接触过的人再与别人接触, 都有可能有SARS病,要你求出给出的所有俱乐部人的名单,要你求出所有的嫌疑犯。。。分析: 用并查集的方法做,具体实现是先定义n个森林,然后再把同一的人所在的森林合并在一起, 而并查集的改善方法有两种,我的使用的是压缩路径的方法*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int X = 30010;int parent[X],a[X],Rank[ 阅读全文
posted @ 2012-03-22 18:13 yejinru 阅读(235) 评论(0) 推荐(0) 编辑
摘要:/*题目: 给出n个商店,每个商店有初始化的商品数量,现在有两种指令: 0 x y 连锁店x的商品数量变化值为y,y > 0商品数量增加, y < 0减少 1 i j 输出编号在[i,j]区间内的连锁店中商品数量为素数的有多少家 当指令为1时,求给出 i到j的商品数量为素数的商店的数目分析: 用树状数组做,只不过在update()处改动一下,并且注意到有可能改动完后和改动前 均为素数的情况,所以用visit[]数组记录此前是否为素数,另外需要注意的是当初始 化时即为奇数的话,当时就要初始化数组c[]以及visit[]数组*/#include <iostream>#inc 阅读全文
posted @ 2012-03-22 15:14 yejinru 阅读(280) 评论(0) 推荐(0) 编辑
摘要:/*哈弗曼编码,比如权值为 a:1 b:1 c:2 d:3 e:5 f:6 的树 1.开始时由最小的两个数 a:1 b:1组成一棵树 2.接着由新的最小的两个数 2 c:2 d:3 e:5 f:6 中的 2 c:2组成新的树 3.接着由最小的两个数 4 d:3 组成新的树 4.接着由最小的两个数 e:5 f:6 组成一棵树 5.接着由最小的两个数 7 11 组成一棵树(最终形成) 6.算最小的编码总长:= 18 + 7 + 11 + 4 + 2 = 42 2 4 7 11 18 / \ / \ / \ / \ / \ a b2 c 4 de f 7 11 / \ / \/ \ /... 阅读全文
posted @ 2012-03-21 19:04 yejinru 阅读(173) 评论(0) 推荐(1) 编辑
摘要:编辑器加载中...本电子词典功能:查单词,单词复习,单词学习,单词填空,根据汉语输入英文,有时间提示的单词风暴第一部分:main函数编写#include <stdio.h>#include <string.h>#include "list.h"#include "tool.h"#include "game.h"#include <stdlib.h>int main(){int m=0,n=7950,c;char ch[130];struct wordnode *head=NULL;head=Crea 阅读全文
posted @ 2012-02-29 22:40 yejinru 阅读(680) 评论(0) 推荐(1) 编辑
摘要:#include <stdio.h>#include <stdlib.h>#define MAXN 1000 typedef struct queue{int qq[MAXN]; //队中元素int front; //队首下标int rear; //队尾下标int count; //队列中元素个数}queue;queue *q;int init() //队列初始化{q=(struct queue*)malloc(sizeof(struct queue)); //申请内存q->front=0; //都置为0q->rear=0;q->count=0;ret 阅读全文
posted @ 2012-02-29 22:38 yejinru 阅读(293) 评论(0) 推荐(0) 编辑