自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AC_Arthur的专栏

Always challenge miracles!

  • 博客(37)
  • 收藏
  • 关注

原创 Codeforces Round #279 (Div. 2) B. Queue(链表)

仔细观察可以发现,用链表的方法我们可以很容易的将偶数位和奇数位的答案补充完整。   只需要记录一个数的前驱和后驱就行了。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#in

2015-10-31 10:54:01 705

原创 HDU 2438 Turn the corner(三分)

昨天个人赛的题目,没有做出来,今天学了一下三分,其实很简单,就是用来求一个凸函数或凹函数的最值的方法。大家可以看这个博客,讲的很清楚 :点击打开链接然后该题就是设拐的角度为自变量,范围0~pi/2 。 然后三分就行了。   这样就可以求出最大值是多少了,然后如果最值比y小,就可以过去,否则不可以。值得一提的是,队里有人用暴力过了,他将拐点设在了车的中间(l/2处),然后暴力的转角,每次

2015-10-31 10:49:48 677

原创 POJ 1651 Multiplication Puzzle(区间DP)

一道比较经典的区间DP,和这题一样:点击打开链接用dp[i][j] 表示消掉区间[i,j]内所有数字后的最优解。   那么状态转移为ans = min(ans,dp(i,k-1)+a[k]*a[i-1]*a[j+1]+dp(k+1,j)); 表示

2015-10-31 10:35:36 811

原创 HDU 1043 Eight(BFS打表+状态去重)

该题是一道经典的八数码问题,难点在于对状态的定义和判断该状态是否访问过。   紫书上列举了三种方法:set存,hash,编码解码。编码解码的原理是利用了康托展开,我们都知道,对于一个长度为n的序列,其全排列一共有n!种,利用康托展开我们可以快速的求出一个排列是按照字典序的第几个排列。这样我们就将每个排列(状态)与一个n!内的整数对应起来了。  但是这样还是会超时,无奈我想到了既然终点状态固定,

2015-10-29 14:01:58 723

原创 HDU 2181 哈密顿绕行世界问题(水DFS)

该题乍看很难的样子,其实就是个水DFS,因为要打印所有可能方案,所以无法剪枝,直接遍历所有可能情况就行。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;cons

2015-10-28 16:11:51 740

原创 ACM竞赛常用头文件模板

哈哈#include//C的输入输出#include//字符串操作函数#include//STL各种算法 比如 swap sort merge max min 比较#include//数据输入输出流#include//c++中的string类 他不能用strcpy等c函数去操作#include#include#include//bitset可按位定义串#include

2015-10-28 16:05:51 5788 2

原创 HDU 5115 Dire Wolf(区间DP)

一道非常经典的区间DP。  一开始没有想明白状态到底该如何表示,因为杀掉一只狼会影响其他狼的攻击力,所以看起来貌似非常难以解决。 但是如果看出了是区间DP之后,就可以展开DP的常规推理了。   首先,是状态的表示,如何表示状态,这是最重要的一步。   表示出状态以后,还要看他是怎么转移的,以及转移过去的子问题是不是和原问题具有相同的结构和意义。    我们套用区间DP常规的状态表示:d[i][

2015-10-21 19:49:31 767

原创 变形课(DFS)

水题#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int mod = 1e9 + 7;const int INF = 1e9;const int maxn =

2015-10-20 17:12:07 699

原创 HDU 1016 Prime Ring Problem(水题纯暴)

直接DFS就行,连剪枝都不要。  因为要打印所有可能解,也没法剪枝 。因为相邻的元素之和要求互素,所以能成立的解很少,解答树并没有想象中那么大。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;type

2015-10-20 16:23:41 623

原创 HDU 4770 Lights Against Dudely(二进制枚举子集)

题目中有一个重要提示: 脆弱的房间最多只有15个,而且灯只能放在脆弱的房间(否则一定会照到坚固房间),而且一个房间只能放一个灯,所以枚举所有子集就行了O(2^15)。一开始没看清题意,以为所有的灯都可以任意朝向,后来才知道只有一个灯可以任意朝向。   所以我们再枚举那个灯是特殊的灯就行了。总复杂度O(15*2^15),可以接受。细节参见代码:#include#include#inc

2015-10-18 09:41:15 669

原创 HDU 4771 Stealing Harry Potter's Precious(BFS)

就是一道简单的BFS,由于要拿到所有宝藏,那么我们可以状态压缩宝藏集合, 为了使得状态表示完整,就需要在状态数组d中多增加一维。比较常见的题型。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int I

2015-10-18 08:55:40 648

原创 HDU 3533 Escape(BFS)

一看就是BFS,但是该题不是很好处理。   给的时限很宽裕,所以对于各个炮塔的状态判断其实是可以在BFS里现算的。我一开始想将各个炮塔在d秒范围内的状态先算出来然后存在数组中,结果MLE,换了个bool型的数组终于勉强存下了。  然后就开始WA,后来才发现原来子弹的途中只要有炮塔就会被阻挡,而不是炮塔被击中时才阻挡子弹。  这样就可以AC了,还有就是HDU的di'scuss里的数据是错误的,炮

2015-10-17 10:54:52 673

原创 Codeforces Round #325 (Div. 2) D. Phillip and Trains (BFS)

一开始看这题,还以为是DP,后来写完记忆化搜索之后发现结果怎么也不对,仔细一想,无论时间复杂度还是状态转移好像都不想DP。    后来想了一下,发现应该是BFS(DFS的盲目性太大,而BFS则可以在最早的时刻剪枝)。   所以我们不妨先用一个数组记录下所有列车在各个时间点的状态,然后用来在BFS中做判断。细节参见代码:#includeusing namespace std;typede

2015-10-16 17:26:19 627

原创 Codeforces Round #325 (Div. 2) C. Gennady the Dentist(水题)

直接暴力就行,n^2复杂度可以承受 。比较坑的是该题爆int 。  因为4*10^3*10^6 > 2147...细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int maxn = 4000 + 5;int n,m,vis[maxn];vect

2015-10-15 20:50:47 574

原创 HDU 2102 A计划 (BFS)

简单BFS,注意好状态转移过程 即可,还有就是一旦踏入传送机,立刻会被传送,所以要立刻改变z坐标细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const in

2015-10-13 22:05:52 708

原创 Codeforces Round #325 (Div. 2) B. Laurenty and Shop(暴力)

一开始真没反应过来,后来才看到题目里特地黑体字加深了该题的关键:只能通过大道一次。也就是说,在什么地方穿过大道定了之后,那么路线也就定了。  因此我们只要暴力枚举在那个大道路口穿过就行了。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int max

2015-10-13 17:47:14 588

原创 UVA 11624 Fire! (BFS)

该题是一道比较简单的BFS, 难点在于火会蔓延,那么我们不妨分开进行两次BFS,一次标记好每一处第一次被火烧到的时间,第二次就可以用这个时间标记来进行BFS了。之前也有过一次记录下时间标记来利用的情况 ,算是个技巧吧。细节参见代码:#include#include#include#include#include#include#include#include#inclu

2015-10-13 16:09:08 543

原创 FZU 2150 Fire Game (暴搜/ BFS+DFS)

对于该题,显然,如果有两个以上的连通块,那么将无法烧尽所有草地。   所以我们可以先用DFS判断连通块个数,然后枚举两个人防火的地点,进行BFS求最短时间。注意,题目中已经给出了提示:两个人可以选择同一个格子。   我就是在这里WA了好久,因为如果只有一个格子是草地的话,如果不让他们坐标相同,那么将不会进BFS,那么答案将是INF。细节参见代码:#include#include#i

2015-10-11 21:44:44 655

原创 POJ 3414 Pots (BFS)

如果用状态这个术语来表示的话,那么显然,两个杯子中水的情况对应了一个状态。  所以用BFS很容易求出最小值。   该题的打印路径其实和紫书上第6张中迷宫问题用的方法是一样的,用一个父亲指针记录路劲个,这样就可以很方便的打印出路径。细节参见代码:#include#include#include#include#include#include#include#include

2015-10-11 19:35:13 588

原创 POJ 3087 Shuffle'm Up(BFS)

很多人不觉得这是个搜索,说是模拟,其实这是没有理解搜索的实质。搜索就是扩充状态和状态的转移。   该题可以将每次洗牌后的情况当成状态进行BFS,只不过这个BFS每次只有一个决策可以拓展罢了,这样当出现状态重复时将无解。那么为什么要用BFS呢?   因为循环结的周期未知,用BFS可以减少递归的无目的性。    而且该题比较简单,每层只有一个拓展点,所以用什么方法倒也无所谓。关于对状态的判

2015-10-11 10:54:01 917

原创 NYOJ 139 我排第几个(康托展开)

对于每一个字符,假设它后面有k个字符比它小,则当前序列的排序会增大k*f[12-i],其中f[i]是是i的阶乘。

2015-10-11 09:25:09 729

原创 求最大值(qduoj)QDU创新实验室第二次月赛B题

描述:给定n个数,a[1]到a[n],请你帮忙找出a[i] - a[j]的最大值,其中1 输入:第一行一个数T,表示一共有T组数据(T 输出:每组数据输出一行,表示最大值是多少。样例输入:255 2 3 6 123 2样例输出:51思路一看到该题,立刻想到了一个O(n)的算法,也就是紫书上构造

2015-10-10 22:16:07 1507

原创 POJ 3279 Fliptile(暴力)

该题乍看很难,如果要是dfs搜的话恐怕无法快速解决问题。但是仔细分析一下的话,会发现 : 首先,对于每个格子,翻转1次以上是没有意义的,等价于没有反转或反转一次。  所以答案不是1就是0其次,如果对答案进行暴力,再检查该答案是否符合要求,那样枚举的时间复杂度高达2^30,还是无法解决该题。  但是我们发现,对于任意一个格子,对它有贡献的只有它自己和上下左右的格子。  所以我们可以只枚举最上

2015-10-10 15:20:08 1655

原创 Codeforces Round #323 (Div. 2) C. GCD Table

根据数表形成的规则,可以很轻松的发现,当前数表中最大的两个数一定是原数列中的数,求出它们的gcd,那么当前数表中一定有两个gcd是他们形成的,将其去除。用什么容器维护都可以,我用的multiset 细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const in

2015-10-09 22:00:26 613

原创 HDU 1495 非常可乐(BFS)

很简单的BFS,由于一个小小BUG,调了一个晚上~再次接触搜索专题,有了一丝不一样的感觉,再看紫书,才明白其中的一些精华 。其实,搜索和动归简直是密不可分,什么BFS啊DFS啊其实都是搜索,手段都是一样的,目的也是一样的。对于搜索,现在逐渐重视到了一个之前忽视的东西:状态。    其实搜索的就是状态,定义的也是状态,剪枝剪掉的还是状态,记忆化搜索保存的也是状态。对于一个搜索,你会遍

2015-10-09 21:36:54 673

原创 HDU 2612 Find a way(BFS)

一开始想法比较傻,对每一个KFC为起点BFS,后来发现其实我们只需要对这两个人为起点BFS一遍就行了,将遇到的每个KFC记录在vector里,但是WA,后来又发现不需要保存的vector里,直接用两个数组记录路径就OK了,成功AC。    之前那个方法肯定也行,不知道哪里出现了BUG。。。细节参见代码:#include#include#include#include#include

2015-10-09 17:11:40 477

原创 POJ 1426 Find The Multiple(dfs)

一开始被m的位数吓到了,以为要用高精度 。  后来发现答案不会超long long,也不知道是数据水了还是本来如此。这样就很简单了, 搜索深度最多19层,每一层只有两个决策: m*10 和m*10+1 。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;t

2015-10-06 21:37:58 581

原创 POJ 2251 Dungeon Master(bfs)

简单的BFS模版题。   重新审视BFS和DFS以及DP,发现三者之间存在莫大关联,总的来说,都是对状态的深入理解,以及记录状态再利用,利用状态扩展其他可能状态,以及利用状态剪枝 。   都是对状态的深入理解。细节参见代码:#include#include#include#include#include#include#include#includeusing namesp

2015-10-06 19:56:49 650

原创 POJ 1321 棋盘问题(搜索)

暴力搜索,只要把握住几个地方就行了 :1. 我们可以按照行来放置,因为任意两个棋子不能同行,所以对于每一行,要么放,要么不放。2.我们可以用一个数组记录每一列在此之前有没有棋子,其实就是一个更简单的八皇后问题。这样已经足够通过本题的数据了,但是我们还可以添加一个剪枝:如果当前棋子数+之后的行数 细节参见代码:#include#includeusing namespace s

2015-10-06 17:39:01 520

原创 HDU 2824 The Euler function(筛法求欧拉phi函数)

该题就是一个筛法求欧拉phi函数值,我预处理了前缀和,没想到比直接求还慢。。。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int maxn =

2015-10-06 08:36:51 979

原创 HDU 1222 Wolf and Rabbit(数论)

该题应该很少有人是我这样做的。。。我自己YY了一下,发现如果狼转了一圈之后没能走回起点,那么它一定能在若干圈之后经过所有洞穴,但是具体证明我还没有想好。 正确性未知。一开始WA是因为忽略了一些特殊情况以及n和m的大小关系。细节参见代码:#include#include#include#include#include#include#includeusing namespa

2015-10-06 08:18:30 623

原创 UVA 11300 - Spreading the Wealth(中位数)

一道很好的题目,通过分析和数学推导,最后将问题转化为:求数轴上一个到n个点距离只和最小的点。那么不难证明,这个点就是n个点的中位数。凡是能转化为这个模型的题目都可以用中位数求解。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int maxn = 1

2015-10-05 13:49:51 641

原创 12097 - Pie (二分)

该题很巧妙的运用了二分搜索的技巧。   我们常常运用二分来做这件事: 看看是否一个值可以使得一件事情成立。   比如最小值最大这类问题。   我们用二分来找这个最值,二分中间,然后判断是否满足要求,依据这个来改变区间短点。   该题中派的面积和n是一个数量级的,所以二分面积的复杂度是log(area) ,我将精度误差调到1e-6,每次判断的复杂度是O(n),所以总的复杂度是:n*log(3.14*

2015-10-04 09:12:28 698

原创 UVA 11520 - Fill the Square (暴力)

该题直接暴力即可,因为一定有解,所以对每一个空格,尽可能的放置字典序小的字母就行了。虽然用dfs写的,但是时间复杂度是显然的,最高只有O(n*n*26)。细节参加代码:#includeusing namespace std;typedef long long ll;const int INF = 100000000;const int maxn = 50 + 5;int T,

2015-10-01 16:50:49 635

原创 UVA 11464 - Even Parity

该题也是一个需要观察和等价转换思维的题目。  如果直接暴力,时间复杂度难以承受,但是其实我们可以发现,只需要枚举第一行就可以了,只要第一行确定了,那么最终的偶数矩阵也就确定了,可以利用偶数限制关系轻松推出其他的格子,在这个过程中判断是否符合规则即可。细节参见代码:#includeusing namespace std;typedef long long ll;const int IN

2015-10-01 15:11:33 686

原创 11384 - Help is needed for Dexter

题目链接经过手动模拟可以发现,由于每个数字都不一样,貌似第一次只能消减一个数字,但是我们可以使得一些数字相等,然后后面就可以减去更多的数字。那么我们取一半的地方,保留1~n/2,后面的数减去n/2+1,恰好后面的数也变成了1~n/2,那么也就等价于一个1~n/2的序列, 操作次数为一次。所以就不难写出递归程序:f(n) = f(n/2) + 1; 边界是f(1) = 1。细节参见代

2015-10-01 15:05:16 752

原创 UVA 10881 - Piotr's Ants(思维转换)

该题是一个考察想象力的经典例子,很考验人的观察和分析能力,要进行合理的等价转换。首先,我们可以发现,相遇之后掉头,相当于直接穿过。   但是这样的话每只蚂蚁的位置和方向就乱了,好像很难处理 。  但是仔细观察可以发现,由于蚂蚁相遇即掉头,所以从左到右,每只蚂蚁的相对位置是固定的,也就是说,从左到右,一开始是第几只,最终还是第几只。   这样就可以解决输出顺序的问题了!  等等,还有方向呢?  

2015-10-01 09:34:10 585

空空如也

空空如也

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

TA关注的人

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