- 博客(46)
- 收藏
- 关注
原创 我和她在大一的时光
ACM一直都是我坚持的目标,从我认识“她”到现在,我一直没有放弃过对“她”的追求。在这条道路上,我尝到了别人不能享受的快乐。同时,我也感受到了“她”的魅力,让我不断地向“她”靠近。 记得我认识“她”是在大一的一个下午,“她”的红色“外衣”吸引了我。那时的我应该还很年少,自己对“她”并不了解。我偷偷的把“她”放进我的书包,在无聊的时候我把“她”拿出来看看,慢慢地,我对于“她”的“柔情”无
2012-11-12 16:25:55
511
原创 hdu 1755 A Number Puzzle
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1755 刚开始看到这个题的时候,看到这个8,于是想到的是8!很小才4万多,不过加上询问次数,就很不乐观了。。。。这个题有点水,可以用暴力过,这个题没有极限数据。。。也就是复杂度为O(8!*2000)。如果我们这么想的话,那么题目中给出K的范围就没有实际意义了(有时候我就喜欢看数据范围,
2012-11-07 20:50:08
605
原创 hdu 1277 全文检索
描述见 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1277 刚开始的想法是KMP算法,因为字符串匹配差不多这个已经是很多的了。。。。但是看着题目中说的关键字最多有10000个,每个字符长度最大60,原文最多有10000个。那么按照KMP算法的时间复杂度,最差的情况下时间复杂度是O(10000*(60+10000))。可想而知,超时那
2012-11-07 13:05:49
303
原创 多重背包【链表写法】
描述请参照上一篇 http://blog.sina.com.cn/s/blog_979e38fc010149me.html具体代码:#include#define N 20typedef struct data{int w,c;struct data *pre;}Data;int W[N],C[N],n,m,now;Data st[10000005];Data *n
2012-11-07 13:05:47
386
原创 多重背包【优先级队列写法】
题目链接:http://poj.org/problem?id=3900 首先声明:本算法不能过这个题,以免耽搁大家的宝贵时间,特此申明!!!不过思想还是挺好的,个人感觉。。。。。 在很久开始学习多重背包的时候,就考虑过,如果背包容量过大(物品'体积'也比较大),而物品的数量过少(当然暴力无法解决的)的时候我们是否还是可以用常规的方法写?比如背包容量为10^9次方,那么常规的方法内存不
2012-11-07 13:05:45
689
原创 hdu 1688 Sightseeing
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1688这个题大概意思是求从s出发,到f的最短路和次短路的条数一共有多少条(注:次短路的长度为最短路+1)解决这个题的办法是:还是开一个二维的数组记录最小值和次小值,和对应的二维数组记录最小值的条数和次小值的条数。其他的和dijkstra做第K短路是差不多,不过还要简单一些,然后统计。代码
2012-11-07 13:05:43
646
原创 【原创】 线段树学习总结
经过了这几天的学习---线段树---收获着实不小,不过解稍微难一点的题还是会有超时的可能,但也算是入门了。我记得在这段时间的学习中,我保持了一个良好的习惯---刚开始的时候不要在网上搜解题报告。这样可以训练你的思考能力,有时候肯能还会和别人的不一样,学习起来就不是那么死板了。这几天的学习大致可以分为4个阶段(区间统计,单点更新,区间更新,区间合并,扫描线(这个只了解到了初级的))。区间统计:
2012-11-07 13:05:41
224
原创 Poj 2886 Who Gets the Most Candi…
题目描述详见:http://poj.org/problem?id=2886本题的解法是:线段树只是当我们删除元素的时候,我们要去推算下一个元素所在的位置。然后直接通过线段树的查找就可了。比如节点里面记录的内容是,左子树中还剩下的元素有多少个,如果我们推算出来了下一个要删除的元素的位置(注:不是编号,是删除元素之后的位置),那么我们通过线段树很快就能查找(线段树求逆序数的思想是一样的)
2012-11-07 13:05:38
229
原创 hdu 1710 Binary Tree Traversals
本题的考点是告诉你二叉树的前序遍历和中序遍历,求后序遍历。我的思路是:因为前序遍历是先遍历祖先在遍历儿子,所以第一个(前序遍历)点一定是根节点。后边依次加入前序遍历中的点,沿着根往下建立,如果待加入的节点的值出现的顺序(中序遍历)在本节点的前面,那么这个点在本节点的左边,否者在右边,知道节点为空,加入节点。后面以此类推,就建立了一棵二叉树。接着后序遍历就可以了……代码如下:#include
2012-11-07 13:05:36
191
原创 hdu 1584 蜘蛛牌
题意见hdu 1584;本题可以采用递归实现,但是本题本人用的是动归。 基本思路是:如果要找1-10排好序的最小移动距离,那么我们可以抽象来1-1+2-10+(1-2的移动距离),1-2+3-10+(2-3的移动距离,注:是2上面所有的牌都移动到3上)……那么求2-10,3-10等都可以了。所以得出来动态转移方程为Dp[i][j]=Dp[i][k]+map[k][j]+Dp[k+1][j]其中
2012-11-07 13:05:32
322
原创 java版 字典树
package test;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.LinkedList;import java.util.Scanner;class Trie{public int flag;public char ch;
2012-11-07 13:05:30
320
原创 感悟
解法1:#include#includechar str[20];char *get(char *p){char *q=new char[20];int i,len=strlen(p);for(i=0;iq[len-1-i]=p[i];q[i]='\0';return q;}int main(){char *p,str[]={"ABCDEF"};p=get(s
2012-11-07 13:05:28
187
原创 hdu 1063 Exponentiation
题目描述参考杭电。本题需要考虑前导0和后导0,比如0001.2 1.2222还有.222之类的。需要注意的是:当去掉后导0的时候一定要考虑1000和1.0000的关系代码实现:#include#includechar str[100];intn,m,ar[1000],arlen,ans[1000],anslen;//ar是保存初始数据,ans保存中间和结果,anslen为an
2012-11-07 13:05:25
218
原创 堆排序的实现(递归)
代码:#includeint ar[120],n;void init(){int i;for(i=1;iscanf("%d",&ar[i]);}void output(){int i;for(i=1;iprintf("%d ",ar[i]);printf("\n");}void Dfs(int x){//建堆int t;if(2*xDfs(2*x);}
2012-11-07 13:05:23
348
原创 优先队列的使用
代码:#include#include#include//队列头文件using namespace std;struct num{bool operator ()(int x,int y){//比较优先级return x>y;}};priority_queue,num>p;int n;void init(){int x,i;for(i=0;iscanf("
2012-11-07 13:05:21
179
原创 hdu 1501 Zipper
本题描述请参考hdu1501,其大概意思为。给你三个字符串,问前两个是否能合成第三个字符串(注:前两个字符串在第三个字符串中的相对位置不能发生改变)。 解决本题最常规的方法就是用搜索,但是麻烦来了,题目给的范围是1-200。难道这道题不能用? 本人解决这题是用搜索过的,不知道这是否是好的算法,但是跑出来的时间还是让人满意的(0ms)。不过在搜索的同时,加了一个优化--记忆搜过的路径。
2012-11-07 13:05:19
235
原创 剖析我的五子棋
(控制台游戏)本五子棋完全独立完成,其基本构思很基础。分为两个模式(人机对战和人人对战)。详情下次分解……(主要是自己现在还处于测试阶段,完成之后,我会第一时间和大家分享)。
2012-11-07 13:05:16
211
原创 USACO Calf Flac
这个题的大概意思是:给你一个字符串(简单的处理)(小于20000),找出最长的回文子串,再输出它在原文中的位置。 这个题常规的想法是,穷举,时间复杂读O(n^2)下面是代码:#includestruct save{char ch;int i;};save ar[20005];char s,str[20005];int n,Max,begin,end;void de
2012-11-07 13:05:14
191
原创 USACO Milking Cows
本题的大概意思是这样的:给你N个喂养奶牛的开始时间和结束时间的时间段。问题是:输出最长的喂养时间段和最长的没有喂养的时间段。(友情提示:这些区间可能会有重复) 本题最常用的一种算法使用线段树解。不过我没有采用那种做法,本人采用的是用链表合并记录。先把n个区间排序(开始时间相同的按结束时间排序,否则按开始时间排序)。这样做的好处是我们只需要讨论结束时间就可以了。(因为开始时间大小已经确定了)然
2012-11-07 13:05:12
238
原创 hdu 1854 Q-Sequence
本题描述参考hdu,在这就不叙述了。下面讲讲我的思路和代码: 刚开始的时候,用DFs去做,感觉到有一点难度。因为它的回溯条件不好掌握,所以尝试了很久,反而没有结果。不过用指针去做就不一样了,凡是把字符串中"001"换成"0"在回溯就好多了。然后我们判断如果“只”剩下一个"0"那么就输出"Yes",否则就输出"No"。下面是代码:#include#include#includes
2012-11-07 13:05:10
356
原创 hdu 2005 第几天? java版
Problem Description给定一个日期,输出这个日期是该年的第几天。 Input输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input,另外,可以向你确保所有的输入数据是合法的。 Output对于每组输入数据,输出一行,表示该日期是该年的第几天。 Sample Input1985/1/
2012-11-07 13:05:08
242
原创 hdu 1434 幸福列车
全部代码实现,没有用STL和queue,函数简单明了!!代码实现:#include#include#includestruct train{char name[30];int rp;train *next;};train *head[10005];int n,m;void get(train *&t){t=(train *)malloc(sizeof(train)
2012-11-07 13:05:05
314
原创 hdu 1427 速算24点
本题采用穷举所有情况即可得出结果。我们来计算一下,首先4个数的位置变换有24种,每种加上有运算符4*4*4=64种,每种有六种运算次序,所以时间复杂度24*64*6。对于人工计算,当然是很难得,但是计算机1秒之内是的得出来答案的,并且,还不是每一个都需要这么多次。代码如下:#include#include#define Inf 0xfffffffint num[10],save[10
2012-11-07 13:05:03
260
原创 hdu 1413 文件系统
此题是一个模拟题,做模拟题,分清条件就可以了。本题我是用c++做的,这样我们可以用string要简便一些。加上vector、map,这样本题就简化多了。具体实现看代码:#include#include#include#include#include#includeusing namespace std;struct command{ vector dir;//当前子目
2012-11-07 13:05:01
244
原创 hdu 1332 LC-Display
这个题就是简单的模拟题,我的思路是一层一层的输出,具体输出用函数实现,这样就简单多了!不过代码有点长,我相信这没有什么影响!我把每个数字输出分成了5个部分,这样便于检查和阅读!代码如下:#includechar s[20];int n;void Outputc(char ch){ printf(" "); for(int i=0;i printf("%c",ch); print
2012-11-07 13:04:59
269
原创 hdu 1317 XYZZY
这个题其实不难1317 XYZZY" TITLE="hdu 1317 XYZZY" />(估计做了之后都这么说)!今天下午错这么多次 不应该呀!以后要注意,特别是在比赛的时候这个情绪要控制。 1317 XYZZY" TITLE="hdu 1317 XYZZY" /> 现在看来这些错第一wr,那么多半是变量混用,而re这个应该归于这个题的自环,这个事怪自己没有考虑。显示用邻接
2012-11-07 13:04:57
196
原创 hdu 1285 确定比赛名次
此题是拓扑排序的典型例子!如果一个队没有前驱就选择,然后去掉以这个点为前驱的点. 代码:#include#includestruct team{ inte,next;}ar[20000];int n,fb[505],num[505];int search(){//找没有前驱的点 int i; for(i=1;i if(fb[i]==
2012-11-07 13:04:54
197
原创 hdu 1269 迷宫城堡
这道题有个特殊数据当n=1是连通的!这道题考的是有向图的强连通的判定,我的做法是,从i-->n如果i和j是连通的并且j 代码:#include#includestruct path{ int s,e; int next;}ar[100005];int fb[10005],flag[10005],Q[10005];int n;int Judge(int x){ int
2012-11-07 13:04:52
178
原创 hdu 1267 下沙的沙子有几粒?
其实这个题和买票(一些人时50的一些人是100的)是一个意思:动态转移方程:map[i][j]=map[i-1][j]+map[i][j-1] j map[i][j]=map[i][j-1] j>=i;代码:#include__int64 n,m,map[25][25];int main(){ int i,j; for(i=1;i map[i][
2012-11-07 13:04:50
223
原创 hdu 1260 Tickets
这道题没想到会这么快AC,就是初步的想了一下动态转移方程,写了个代码: 动态转移方程为:Dp[0][i]=Min(Dp[0][i-1]+ar[i],Dp[1][i-1]+ar[i]); Dp[1][i]=Dp[0][i-1]+ans[i-1]-ar[i-1]; 其中Dp[1][i]代表这个人和前面一个人一起买的,Dp[0][i]代表自己一个人买的 1260 Tickets" T
2012-11-07 13:04:48
221
原创 hdu 1225 Football Score
简单的排序:此代码是用vector和map做的,用tries应该还快一些#include#include#include#include#include#includeusing namespace std;struct team{ char name[100]; int score; int kicked; int lost;}ar[2000];int n,now
2012-11-07 13:04:46
199
原创 hdu 1220 Cube
先求每一层的个数,然后求不在同一层的pairs:#includeint n;int get(int x){//求同一层的pairs int i,j; int Count=0; int t=x*x; for(i=0;i Count+=t-3; j=0; t--; for(j=1;j { Count+=t-3; t--; } Count+=t-
2012-11-07 13:04:44
153
原创 hdu 1217 Arbitrage
思路:floyd算法 #include#includeusing namespace std;double map[50][50];string ar[50],s,e;int n;int search(string a){ int i; for(i=0;in;i++) if(a==ar[i])
2012-11-07 13:04:41
296
原创 hdu 1216 Assistance Required
简单的模拟,用数组更简洁:#include#define Max 40005int n,num[3000];struct point{ int x; int next;}ar[Max];int x;int D(){ int sum=0,t,k,h; h=x; t=ar[x].next; k=ar[x].x; x=ar[x].next; while(t!=-1
2012-11-07 13:04:39
213
原创 求1到n之间素数的个数
本题的n 本题的另一种解法是Dfs+容斥原理,你可以这样想a=sqrt(n)最多不过10000。 首先我们都知道一个合数都可以用多个素数的乘积表示,比如:30=2*3*5.所以我们可以求出合数的个数,再从总数里减去就可以了。这样我们可以减去2的倍数(当然不包括2),3的倍数……。但是我们有发现6既是2的倍数也是3的倍数,这样就产生了容斥原理。下面是代码: #incl
2012-11-07 13:04:37
6467
原创 搜索+离散化思想
这道题的意思差不多是这样的:有一个人没有事做了,就掷骰子。他连续掷n次,问连续出现大于3的次数大于m的概率是多少?初一咋看不就是把次数找出来,再除以总数不就是答案了么。就没有考虑的用了搜索,结果可想而知--超时。难道我们真的不能用搜索,是否是DP呢?最后我把前面的数都用打表的方式列出来,仔细看了看,真的还没有什么规律呢(不知道是否真的没有规律)!最后又想了想,大于3,那45 6的地位不就是一样的
2012-11-07 13:04:35
308
原创 平衡三进制
给你一个天平,和一些砝码,只是这些砝码有点特殊,它的重量是1,3,9,27,……3^n。让你把一些砝码和一个给定的重量的物体放在左边,另一些砝码放在右边,使天平平衡(每个砝码最多用一个),你会怎么做呢?这是一个很有趣的事,不是吗?这就是用平衡三进制解决最好的一个例子: 比如我们假设这个物体的重量是20,那么我们可以这样做。首先我们把20(十进制)转化为三进制(202),然后我们按照一定的规
2012-11-07 13:04:33
1286
原创 算术表达式
此算术运算是利用栈具体实现,并且是整数运算:#include#include#define Inf 0xfffffffusing namespace std;stack p;stack q;int num1,num2,num;int Caculate(char s){//具体执行运算switch(s){case '+':num=num1+num2;break;case
2012-11-07 13:04:31
270
原创 二叉树的宽度
昨天晚上帮同学看代码,发现了一个新的方法,想了又想还是把它写下来。下面就是算法的代码:#include#include#define Max_size 1000struct Tree{//存节点信息 char ch; Tree *l,*r;};Tree *root;struct Queue{//队列 Tree *data;}ar[Max_size];
2012-11-07 13:04:29
308
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人