自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

1292765944的专栏

记录我的acm之路

  • 博客(42)
  • 资源 (1)
  • 收藏
  • 关注

原创 UVA 11218 - KTV

brute force暴力枚举即可,位运算hash判重#includeint n,ans;int a[100],b[100],c[100],d[100],s[100];void init(){ for(int i=1;i<=n;i++){ d[i]=(1<<a[i])+(1<<b[i])+(1<<c[i]); }}int main(){ int i,tm1,tm2; in

2012-01-27 22:45:57 1007

原创 UVA 321 - The New Villa BFS+位运算

状态总数10*2^10=10240,hash判重即可注意点:在A房间不能关掉自己房间的灯(oh,my god,太伤了!) #include#include#includeusing namespace std;int r,d,s,sum;bool map[11][11],sw[11][11];bool visit[11][1100];int type[11][1100];

2012-01-27 22:43:48 1069

原创 Codeforces Problem 37B - Computer Game

按题目要求写就可以 #include #include #include struct point{ int pow; int dmg; int num; }str[1010]; int visit[1010]; int ans1[1010],ans2[1010]; int cmp(con

2012-01-27 14:04:47 848

原创 Codeforces Problem 51D - Geometrical problem

从前三个数中找到公比(最多去掉一个数),检查后面数是否满足等比#include #include #include int in[100010];int min(int a,int b){ return a>b?b:a;}int main(){ int i,j,k,n,p,ans; double d; scanf("%d",&n); for(i=1;i<=n;i++){

2012-01-27 14:01:42 823

原创 BOJ 170 Fake Coins

题目地址http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=170这个题用到信息论里的几个概念。信息量、熵(不会的百度一下)假币可轻可重,每枚硬币都可能是假币。故此问题共有2*n种情况,每种情况的概率为1/(2*n)。所以此问题的熵为log(2*n)/log2。实验最多可能

2012-01-26 12:59:21 995

原创 HDU 3573 Buy Sticks 贪心

很简单一题,见代码#include#include#includeusing namespace std;int min(int a,int b){ return a<b?a:b; }int main(){ int t,T; int a,b,c; scanf("%d",&T); int sum; for(t=1;t<=T;t++

2012-01-25 22:03:17 859

原创 HDU 3979 Monster 贪心策略

听戴牛讲完这题体会了排序不等式在贪心中的作用这个题说的是后很多怪兽同时攻击一个游侠,怪兽有不同的血量和攻击力。游侠有一个攻击力,如果选择攻击怪兽的顺序使得游侠扣血最少贪心构造:对于2只怪兽,A,B;假设当前怪兽总攻击值为V。设怪兽A的攻击力,和被攻击次数(攻击多少次死亡) 为 GA,CA;设怪兽B的攻击力,和被攻击次数(攻击多少次死亡) 为 GB,CB;可知,如果先攻击怪兽A,

2012-01-25 21:25:15 154

原创 POJ 3067 Sudoku DLX

和POJ 3074一样#include#define inf 1e8#define M 16*16*16*16*16*4+100#define N 16*16*16+100 int U[M],D[M],L[M],R[M],C[M],X[M];//x代表M所属的行,c代表M所属的列,U,D,L,R为一个元素的上下左右指针int H[N],S[N],Q[N];//H是水平循环链表的头指针

2012-01-25 17:51:03 642

原创 POJ 3074 Sudoku DLX

建图还是坑了我一下午。。。。终于把数独搞定了(囧)具体细节我加了注释#include#define inf 1e8#define M 9*9*9*9*9*4+100#define N 9*9*9+100 int U[M],D[M],L[M],R[M],C[M],X[M];//x代表M所属的行,c代表M所属的列,U,D,L,R为一个元素的上下左右指针int H[N],S[N],Q[

2012-01-25 17:27:07 1097

原创 Codeforces Round #104 (Div. 2) E - Lucky Subsequence

这个题其实就是个dp(类似背包),但是一些细节还是让我做了一晚上。这个题学习了组合数取模(逆元法) 补充知识:逆元的求法(a/b) mod p=a*(b逆) mod pb*x=1(mod p) x就是b的逆元而b逆可以利用扩展欧几里德或欧拉函数求得:1).扩展欧几里德:b*x+p*y=1 有解,x就是所求2).欧拉函数:b^(p-1)=1(mod p),故b*b^(

2012-01-25 00:37:13 1206

原创 Codeforces Round #104 (Div. 2) D. Lucky Number 2 模拟策略

给出我自己的证明:不可能出现fabs(a47-a74)>1。首先把所有的4排成一排,如果在队首前插入7,则无论插几个只多一个a74;如果在队尾后插入7,则无论插几个只多一个a47,;而在两个4中间插7,不管插几个,a47与a74都同等的只增加一个。故得证。#include#include#includeint max(int a,int b){ return a>b?a:b;

2012-01-24 14:32:12 889

原创 USTC 1281 Unhappy dots STL map

这题被set坑了,问了问戴牛原来multiset的count 复杂度很大,是logn+o(元素个数),所以我悲剧的一直TLE啊(除夕夜就这么悲剧....)其实是用map#include#include#include#includeusing namespace std;int x[100005],y[100005];int visit[100005];int h[5]={1

2012-01-23 22:36:01 750

原创 HDU 4022 Bombing STL/二分

用stl的set和map#include#include#include#include#include#include#include#includeusing namespace std;typedef map > def;void pop(def &a,def &b,int k){ printf("%d\n",a[k].size()); for(multise

2012-01-23 20:59:00 988

原创 POJ 2796 Feel Good 单调栈

最近做这方面的题很多,感觉单调栈很是神奇,通过维护一个单调不减的栈,遇到小于栈顶的栈顶元素便出栈,此时跟新结果。这个比RMQ的ST算法要快很多,ST算法要枚举每一个区间(没想到其他做法,可能要dp,反正不会)。这个题关键在于给每一个点找一个最长子序列,使其最小值为其本身,这样扫一遍得到结果。而单调栈正好可以解决这个问题。(这个题大家注意要用long long我被int卡死,干脆全换long

2012-01-21 16:10:49 1755

原创 计算n!末尾所包含0的个数

这是一个有趣的问题。例如,5!=120,其末尾所含有的“0”的个数为1;10!= 3628800,其末尾所含有的“0”的个数为2;20!= 2432902008176640000,其末尾所含有的“0”的个数为4。这里先给出其计算公式,后面给出推导过程。令f(x)表示正整数x末尾所含有的“0”的个数,则有:       当0       当n >= 5时,f(n!) = k

2012-01-21 13:58:06 5516

原创 POJ 2082 Terrible Sets 单调栈的应用

题目条件叙述挺恶心的,其实表达意思挺简单的。就是给你几个矩形(依次在x轴上排开),问你能够组成的最大矩形面积。本题采用一个栈作为存储数据结构,当前读入的矩形的高度如果大于栈顶矩形的高度的话直接进栈,否则依次出栈计算跟新最大面积,直到某一刻栈顶的高度小于当前读入的矩形的高度,进栈,这样把所以矩形都读入后在扫一遍栈跟新最大面积即可。#include#include#include#inc

2012-01-21 01:09:19 1739

原创 sgu 185 Two shortest 最大流

这道题思路就是由最短路边组成的边集搞一次最大流得到的是互不相交的路径。首先用SPFA得到各点到源点的最短距离,在遍历一遍所有的边,通过判断是否满足dis[u]+map[u][v]==dis[v]来判断是否在最短路边集上。然后用SAP求一下从1到n的最大流,如果小于2则no solution。否则dfs2次打印路径。#include#include#include#includ

2012-01-20 23:48:13 1014

转载 三种博弈简介

博弈论基础知识另附资料: http://www.math.ucla.edu/~tom/Game_Theory/Contents.html   有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理.下面我们来分析一下要如何才能够取

2012-01-20 20:42:09 849

原创 POJ 1700 Crossing River 贪心策略

这个题比较有意思,小的时候就做过这种智力题....首先分情况讨论(剩余人数记为left)left==1时,直接自己过去left==2时,直接一趟过去left==3时,先用最快的人送走最慢的人,再回来,然后一趟就过去了left>=4时,就有两种可能了(四个人为1,2,3,4)                ① 1和4先过去,1回来,1和3再过去,1回来

2012-01-20 17:49:20 830

原创 HDU 3177 Crixalis's Equipment 贪心

这个题的贪心的顺序比较难想。int cmp(const void * a,const void * b){ struct point * aa=(struct point * )a; struct point * bb=(struct point * )b; return bb->c-aa->c;//return aa->v+bb->needextra-(bb->v+aa->

2012-01-20 17:07:56 924

原创 POJ 1704 Georgia and Bob

此题是阶梯博弈。学习阶梯博弈的话推荐看这个博客,讲的很好http://blog.sina.com.cn/s/blog_63e4cf2f0100tq4i.html此题wa在sort函数,发现我竟然不会用呀!郁闷这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对

2012-01-20 16:00:45 917

原创 POJ 3460 Booksort IDA*

此题是黑书上的例题,其中估价函数比较强大,看黑书看懂的。不过这里也挺繁杂的,不小心就出错,贡献了好几个wa。代码能力还是太弱其中的注意点我都注释了,其他的就是套模板了。#include#include#include#includeusing namespace std;int n;int bound;int book[20];bool ans;int Min(int a

2012-01-19 21:48:01 1247

原创 POJ 2331 Water pipe IDA*

预处理估价函数。其他的套模板就可以了。不过有一个地方没住意WA了2小时。#include#include#includeusing namespace std;int sx,sy,tx,ty,n;int len[5],num[5];int bound,total;int h[2]={1,-1};int hx[1010],hy[1010];bool ans;struct

2012-01-19 18:19:46 1252

原创 A*,IDA*,Dijkstra

最近做了很多这方面的题,看了很多前辈们的资料。逐渐对这些算法有了一些理解。Dijkstra算法就是传统的求最短路算法。每次维护一个堆,记录未找到与源点之间最短路的点,然后不断从中取出最小的点,出堆,然后对其他点跟新。(可用set实现)A*算法与Dijkstra的区别就是每次出堆的点是到目的点相对最近的(用启发函数计算),然后对其他点跟新。A*算法总可以确定的找到一条最短路径。关于A*的正确

2012-01-19 14:10:44 3386

转载 A* 简介(Amit's A star Page中译文)

Amit's A star Page中译文译序这篇文章很适合A*算法的初学者,可惜网上没找到翻译版的。本着好东西不敢独享的想法,也为了锻炼一下英文,本人译了这篇文章。由于本人英文水平非常有限,六级考了两次加一块不超过370分,因此本译文难免存在问题。不过也算是抛砖引玉,希望看到有更多的游戏开发方面的优秀译作出现,毕竟中文的优秀资料太少了,中国的游戏开发者的路不好走。本人能力有限

2012-01-18 22:18:55 1902

原创 POJ 1011 Sticks 强大的剪枝

这道题是黑书剪枝的例题,是用方法为调整法,但是这个方法很难掌握,还是多积累些经验吧。首先要排个序,然后从大到小遍历回溯搜索是否可组成。回溯中有剪枝。1,对于一个还没有匹配任何长度(need=leng)的初始长度leng,随便搜一个小与此初始长度的木棍,如果之后的搜索不能匹配,那就不能匹配了,此时就要返回上一层修改策略。2,还有就是如果当前选的小木棍len[i]==need时,如果这

2012-01-18 11:38:04 1553

原创 HDU 4090 GemAnd Prince 暴搜+剪枝

我在搜与某一块相连的方块时,用BFS搜的话用在HDU4989ms险过,在BOJ6012ms超时。然而换成DFS搜在HDU2765ms,在BOJ3598ms都过了。估计这类问题DFS就是比BFS快。不知道为什么啊?#include#include#includeusing namespace std;int n,m,k;int g[10][10];int best;int

2012-01-17 18:09:38 1527

原创 HDU 4016 Magic Bitwise And Operation 暴搜+剪枝

这个题得用一下位运算‘&’的性质:若c=a&b,则c设置long long最大值时可以这么写const long long MAX=(~(0ULL)>>1); #include#include#includeusing namespace std;const int N=45;const long long MAX=(~(0ULL)>>1);int t,c,

2012-01-17 13:57:59 898

原创 POJ 2286 The Rotation Game IDA*

这个题用IDA*算法比较好,代码量也比A*小,空间消耗也小。估价函数也比较好找,就是中间8个方格距离这8个方格同数的最短距离。#include#include#includeint init[30];int sol[1010];int bound;bool ans;int final;int e[8]={6,7,8,11,12,15,16,17};int re[8]={5

2012-01-16 14:43:27 1217

原创 POJ 1147 Binary Codes 杂题

这个题我是看着解题报告做的。首先可以根据最后一列推出第一列。然后依次寻找每一行自己左移得到的下一行记录到next数组中#include#includeint main(){ int n; int lastcol[3005]; int firstcol[3005]; int firstrow[3005]; int visit[3005]={0};

2012-01-16 12:44:39 1051

原创 POJ 1077 Eight A*

/*终于用A*做出了这道经典八数码*/#include#include#include#include#includeusing namespace std;struct point{ char board[10]; int space;};int f[400000],d[400000];int colour[400000],parent[400000],moves[400

2012-01-14 21:13:21 1052

原创 POJ 2935 Basic Wall Maze BFS

注意墙的处理,我是这么做的,把每个方块不能行走的方向标记出来,剩他的就是传统BFS了。#include#includeusing namespace std;int sx,sy,ex,ey;int h[4]={1,-1,0,0};int g[4]={0,0,1,-1};int dir[8][8][5];bool visit[7][7];struct point{ int x;

2012-01-14 13:49:38 893

原创 POJ Holedox Moving BFS hash判重

这个题被stl的queue坑了2小时,一直re,换成手写的队列就ac了#include#include#include#includeusing namespace std;int n,m,l,k;int map[25][25];bool visit[25][25][16400];int h[4]={1,-1,0,0};int g[4]={0,0,1,-1};struct

2012-01-14 00:25:06 1025

原创 POJ 1465 Multiple BFS

上来一看只会暴力,网上看了看资料,知道了还有一个剪枝假设A,B对于X的余数相同 那么 (10*A+d[i])%x  =(10*B+d[i])%x ,所以只有当余数没出现过的情况下才加入到搜索的队列中来另外还有一个问题,就是可能是最后的答案出现很庞大的位数,所以要用指针,这里我是用数组模拟。还有就是单独处理N=0的情况 ,RE了好几次#include#include

2012-01-13 19:44:02 1075

原创 ZOJ 2913 Bus Pass BFS水题

不过我感觉这道题的数据有点问题,WA了我好几次这道题考点就是用SPFA求最短路#include#include#include#define INF 1000000000using namespace std;int te[10009],map[10009][15];int num[10009],res[10009];int nr,first,nz;int MAX (i

2012-01-13 17:56:57 1030

原创 ZOJ 1649 Rescue BFS水题

要注意的是队列里入队条件有些变化#include#include#include#include#includeusing namespace std;int n,m,sx,sy,ex,ey;char map[210][210];int mini[210][210];int h[4]={1,-1,0,0};int g[4]={0,0,1,-1};struct point{

2012-01-12 21:45:16 771

原创 HUST 1017 Dancing Links 模板

#include#define N 2011#define M 102011int U[M],D[M],L[M],R[M],C[M],X[M];//x代表M所属的行,c代表M所属的列,U,D,L,R为一个元素的上下左右指针int H[N],S[N],Q[N];//H是水平循环链表的头指针,S代表每一列的元素个数,Q存储一个可能结果int size,n,m;void remove(in

2012-01-10 15:52:07 1010

转载 HDU 2196 Computer 经典树形DP

hdu 2196 Computer 经典的树形DP 两次DFS遍历题意很简单,就是给你一棵树,每条边都有一定的权值,然后让你找到每个点所能走到的最远距离那么我们可以这样高效的来处理先以 1 作为根节点进行一次 dfs 遍历,遍历的时候把以 第 i 为根节点往子树方向可以走到的最远距离和次远距离给求出来,且这两个距离是不在同一个分支中的然后我们进行第二次的从根节点开始dfs遍历,这时

2012-01-06 22:49:00 903

转载 HDU 1568 Fibonacci

先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7;log10(1.0234432)就是log10(10234432)的小数部分.log10(1.0234432)=0.010

2012-01-06 19:40:46 518

转载 斐波那契数列集锦

斐波那契序列 集锦 (转)[定理1] 标准Fibonacci序列(即第0项为0,第1项为1的序列)当N大于1时,一定有f(N)和f(N-1)互质其实,结合“互质”的定义,和一个很经典的算法就可以轻松证明 对,就是辗转相除法 互质的定义就是最大公约数为1数学归纳法是很有用的证明方法,我们接下来这个定理用数学归纳法就很好证明: [定理2]若i为奇数, f(i)*f(i)

2012-01-06 19:35:33 1300

AC自动机通配符匹配

详细介绍AC自动机原理和通配符匹配原理,值得一看

2014-01-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除