自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (1)
  • 收藏
  • 关注

原创 hdu 4768 Flyer 长春网络赛 1010 二分

思路:因为只有一个是奇数,别的都是偶数,所以前面n个人收到的传单和为奇数时,表示解在1到n,那么就满足了单调性,可以二分解答。#include #include #include using namespace std;const int maxn=2e4+9;const double inf=1e10;int n;struct D{ long long a,b,c

2013-09-29 01:09:05 1328

原创 hdu 4766 Network 长春网络赛 1008 计算几何

可以得出一个结论,得到最优距离的那个点a,要么是目标点,要么就是距离某个点距离为d的点。第二种情况有两种情形:1:仅仅距离一个点b的距离为d,那么a必定位于目标点到b的连线上。                                        2:至少距离两个点的距离为d。那么就可以分别枚举这三种情况了。#include #include #include #

2013-09-28 22:11:45 2384 7

原创 poj 2431 Expedition 贪心

简单的说说思路,如果一开始能够去到目的地那么当然不需要加油,否则肯定选择能够够着的油量最大的加油站加油,,不断重复这个贪心的策略即可。#include #include #include #include #include using namespace std;const int maxn=1e4+9;int dist,p,n;struct S{ int d,f

2013-09-27 14:40:44 1128

原创 poj 2433 Landscaping 贪心

很想知道这个题目有没人用dp做的。因为我一开始想到的就是dp,但是没设计出有效的解法。但是其实这个题目应该还是比较明显的符合贪心的性质的,那么直接贪一下就好了。#include #include #include using namespace std;const int maxn=1e3+9;int a[maxn];int n,k;int work(){ in

2013-09-27 01:08:41 1811

原创 poj 2432 Around the world bfs+哈希

由于每个点的状态包含走过来的距离,所以要存二维的状态,但是状态总量太多,所以可以用哈希来搞。那么就是bfs最短路,哈希记录状态了。#include #include #include using namespace std;const int maxn=5e3+9;int n,m;int a[maxn];struct{ struct {

2013-09-26 17:13:47 1290

原创 2013 长沙网络赛 B 题 Bizarre Routine

题解http://blog.csdn.net/u010257508/article/details/11936129#include #include #include using namespace std;const int maxn=1e4+9;int mint[maxn],maxt[maxn],ans[maxn];int n,t,a,b;void dfs(int

2013-09-25 23:09:26 823

原创 poj 2430 Lazy Cows 状压dp

这个题目还是比较容易想到用状态dp来解的,但是状态的转移比较麻烦,并且加上有离散化,比较容易出错。dp[i][j][k]表示覆盖前i列,用了j个矩形,当前覆盖状态为k的最优解。k==1:覆盖1号格子k==2:覆盖2号格子k==3:覆盖1,2号格子,并且为同一个矩形k==4:覆盖1,2号格子,并且为不同矩形那么转移的时候就需要考虑,新建矩形,或者直接把当前矩形边长延伸。转移种

2013-09-25 16:24:56 1363

原创 poj Fence Repair 贪心

反过来做,就是要合成一个板,容易想到每次选取最小的两块合并,结果最优。#include #include #include #include #define ll long longusing namespace std;const int maxn=2e4+9;int main(){ int n; priority_queue ,greater > q;

2013-09-25 01:25:35 1168

原创 zoj Candies 贪心

根据题目可知3K位置的数量是可以直接确定的,并且n-2-3*k的也可以确定。所以只要这两部分不重合,答案就是确定的,或者有额外的位置是原来就已知,也是确定的。答案不确定的情况下,容易知道,有%3==1位置是同时取到最大值的,mod3==2也是同时取到最大值的。所以可以分别求出这两部分的最大值,然后O(1)回答。#include #include #include using name

2013-09-25 00:56:39 1099

原创 poj 3974 Palindrome 最长回文

Manacher算法。不过不知道为什么我写的比比人慢这么多。。。。#include #include #include using namespace std;const int maxn=2e6+9;char a[maxn];int dp[maxn];inline int max(int &a,int &b){ if(a>b) return a; re

2013-09-24 11:51:42 887

原创 hdu 4126 Genghis Khan the Conqueror 最小生成树变形

先求最小生成树,然后dfs求生成树的最小替代边。#include #include #include using namespace std;const int maxn=3e3+9,inf=1e9;int n,m;int dist[maxn],g[maxn][maxn],tree[maxn][maxn];int f[maxn][maxn];struct{ int

2013-09-24 01:08:07 1253

原创 poj 4756 Install Air Conditioning 生成树变形

南京网络赛的题目题意:有一条边不能用,但不知道是哪条,问最坏情况的最小生成树的大小。思路:最容易想到的做法就是求最小生成树,然后枚举的删去最小生成树上的边,再求最小生成树,取最大值。n^3,              超时           那么可以用求次小生成树的思想,求出每条最小生成树上的边的最小替代边。这个可以用树形dp的思想n^2解决。#include #inclu

2013-09-23 18:14:02 1172

原创 poj 3254 Corn Fields 状压dp

简单的状压dp,用的是按格递推的方式,这样写要比较简单高效一些。#include #include #include using namespace std;const int maxn=13,mod=100000000;int dp[2][8200];inline void add(int &a,int &b){ a+=b; a%=mod;}int m

2013-09-20 16:12:20 715

原创 hdu 4747 Mex

题意:求所有子区间Mex的和。Mex是最小的,不存在集合里的非负整数思路:首先考虑从1开始的所以Mex值,必然是非递减的,并且可以O(n)求出。(具体看代码)先考虑如何从1开始的Mex值求出从2开始的Mex值1.如果Mex2.如果Mex>a[1],并且该区间内不包含另外一个a[x]==a[1],那么Mex=a[1]。那么我们需要先预处理出next

2013-09-20 00:46:47 2047

原创 poj 2114 Boatherds 树的分治

还是利用点的分治的办法来做,统计的办法不一样了,我的做法是排序并且标记每个点属于哪颗子树。#include #include #include #include using namespace std;const int maxn=1e4+9;int head[maxn],lon,n,mm,m;struct{ int next,to,w;}e[maxn<<1];vo

2013-09-12 22:53:54 792

原创 poj Sightseeing Cows 分数规划+spfa

分数规划的标准做法,先二分答案,然后spfa找正环。#include #include #include using namespace std;const int maxn=1e3+9,maxm=5e3+9;double a[maxn];int head[maxn],lon;struct{ int to,next,w;}e[maxm<<1];void edgein

2013-09-12 00:14:14 751

原创 poj 1741 Tree 树的分治

解法论文中有,就是把路径分成经过树根,和不经过树根两类,每次处理经过树根的,然后剩下的子树部分可以递归处理,如果每次选取树的重心,那么可以保证最多递归logn层。经过树根的先排序,然后O(n)的复杂度就能算出,那么每层的复杂度nlogn,最多递归logn层,总复杂度nlogn^2#include #include #include #include using namespace std;

2013-09-11 12:22:35 925

原创 poj 3266 Cow School 分数规划

这个题目难度非常大,首先对于老师的一种方案,应用分数规划的一般做法,求出所有的c=t-rate*p,如果没有选择的c值中的最大值比选择了的c值中的最小值大,那么这个解是可以改进的。那么问题就转化成了怎么求最小的c和最大的c。t-rate*p 求这种类型的最值,并且rate是单调的,那么就可以考虑利用斜率优化的那种办法来维护决策点。考虑两个决策点,得到ti-tj>rate(pi-pj)

2013-09-10 22:15:09 1556

原创 hdu 4712 Hamming Distance bfs

我的做法,多次宽搜,因为后面的搜索扩展的节点会比较少,所以复杂度还是不需要太悲观的,然后加上一开始对答案的估计,用估计值来剪枝,就可以ac了。#include #include #include #include using namespace std;char a[11];int key[111111];int hash[1111111];int que[2111111];

2013-09-08 21:56:30 976

原创 hdu 4710 Balls Rearrangement 数论

这个公倍数以后是循环的很容易找出来,然后循环以内的计算是打表找的规律,规律比较难表述,自己看代码吧。。#include #include #include using namespace std;const int maxn=1e6+9;struct{ int to,next;}e[maxn*2];int head[maxn],lon;bool text[maxn];

2013-09-08 21:53:16 980

原创 hdu 4714 Tree2cycle dp

用树形dp做的,dp[t][i]表示t及其孩子入度都已经小于等于2并且t这个节点的入度等于i的最优解。那么转移什么的自己想想就能明白了。关键在于这个题目会暴栈,所以我用了一次bfs搜索出节点的顺序,然后再计算。#include #include #include using namespace std;const int maxn=1e6+9;struct{ int

2013-09-08 21:48:21 942

原创 poj 3169 layout

#include #include #include #include using namespace std;const int maxn=1e3+9,inf=1e6+9;struct{ int to,next,w;}e[maxn*20*2];int head[maxn],lon;int n,ml,md;void edgeini(){ memset(hea

2013-09-07 23:34:34 736

原创 poj 3133 Manhattan Wiring 插头dp

插头dp 这个题目还是比较直接的,就是转移比较麻烦,要先考虑格子的三种情况,然后分别讨论转移情况。不过我认为用启发式搜索应该是可以更加直接有效的过这题。有时间再试试启发式。#include #include #include using namespace std;const int maxn=10,maxm=2e4+9;int a[maxn][maxn];int n,m;

2013-09-07 00:22:02 1084

原创 poj 1739 Tony's Tour 插头dp

第一道插头dp,还是非常艰难的,做法的话cdq论文中已经讲得很清楚了,用的是最小表示法,但是这个题目因为障碍的存在导致细节处理上面更加麻烦。#include #include #include using namespace std;const int maxn=9,maxm=3e3+9;;char a[maxn][maxn];bool first[9][9];int n,m;i

2013-09-06 12:19:07 926

原创 poj 3040 Allowance 贪心

贪心,从大到小排序,只要不超额就能放多少就放多少,最后再从小的开始找一个放进去能超额的。正确性证明,因为大的是小的倍数,所以大的放进去不超额一定要放进去,因为小的不管怎么取,再超过c之前一定会凑成这个大的面额,那么用大的代替一定更优。第一步做完之后,那么现在一定要再放进去一个硬币,那么选择最小的并且能大于c的也一定是最优的。#include #include #include #

2013-09-04 22:39:49 972

原创 poj 2411 Mondriaan's Dream dp

一个比较简单的状压dp,记录下每个点的状态即可。#include #include #include using namespace std;const int maxn=13;long long dp[maxn][maxn][2100];int main(){ int n,m; while(scanf("%d %d",&n,&m),n||m) {

2013-09-04 21:11:45 717

原创 poj 2454 Jersey Politics dfs

这个题目第一步还是比较明显的,先把最小的n个值去掉,剩下的问题就是能不能把数据分成两半,使得每一半和都大于n*500,这个刚开始考虑了下dp的做法,但是复杂度不满足要求。那么能想到的就是搜索了,实际上这个搜索的上限还是比较高的,就只能依靠良好的剪枝试试了,两个情况,剩下的值全部选最大还小于要求,剩下的值全部选最小另一半还小于要求。0ms ac#include #include #inc

2013-09-03 23:19:19 1007

原创 poj 3271 Lilypad Pond bfs

因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步).然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数。(至于原题问的为什么是这个,很简单,因为建造的香蒲要最少,所以不会重复建造,不会多建造,所以就是求最短路,至于路径数,因为现在路径长度是简单递增的,所以直接累加就可以了)。#include

2013-09-03 00:25:27 1380

原创 poj 1991 Turning in Homework dp

这个可以证明必须从两边的任务开始交起,因为中间交的任务可以后面经过的时候再交,所以就变成了一个n*n的dp。#include #include #include #include using namespace std;const int maxn=1e3+9;int dp[maxn][maxn][2];struct D{ int x,t; bool opera

2013-09-02 21:14:29 1452

原创 poj 2166 构造

一个看了解题报告才能想明白的题目,第一点比较容易想明白,就是每次把1交换到堆顶之后如果能够换到最后面的位置那么一定是最优的,但是怎么实现这个没有想明白。题解的那种构建方法,及从2开始插入,是可以保证达到上述效果的,这个自己想想就能明白。#include #include #include using namespace std;const int maxn=5e4+9;int h

2013-09-02 20:15:57 1201

原创 poj 2201 构造

这个题目的构造方法应该还算是很好想的,先给a按照从小到大排序,然后按顺序插入数据,构造一棵二叉查找树,而且50000的数据,nlogn的做法,应该还是很好的。不过这个题目的编码比想象中要麻烦一点,并且编码完成后居然返回了一个tle。表示不能理解,生成了一个大数据后,发现如果排序后k也有序,那么就会二叉树退化,n*n的复杂度。简单画画图可以找到一个优化,先找要插入数据的后继或者前驱,然后从哪个位

2013-09-02 19:49:16 979

poj 3947 题解

经典O(n)求最长回文 acmer新手可看

2013-09-24

空空如也

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

TA关注的人

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