自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 poj 1329(求三角形外接圆)

外接圆半径:公式:a/sinA=b/sinB=c/sinC=2R (R就是外接圆半径) 本题可以这样:①.先利用余弦定理:a^2=b^2+c^2-2bc·cosA 求出:cosA=(b^2+c^2-a^2)/2bc 在利用公式:sinA^2+cosA^2=1确定 sinA=根号(1-cosA^2) =根号[(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)]/(2bc) 

2016-04-30 11:43:48 796

原创 poj 3348(求凸包面积)

题意:一片草地上有n课树,现在你想用绳子圈出一个尽可能大的面积出来养牛。已知每只牛需要50单位的面积,问最多能养几只牛。解题思路:凸包的面积。这里一般的思路就是先求出凸包,再以最低点为顶点分割n-2个小三角形,这样只需要求n-2个三角形的面积即可。不过这样做可能精度损失有点大。最好的方法就是用向量的叉积,当然要取绝对值。#include#include#include

2016-04-30 11:09:56 817

原创 hdu 4193(单调队列)

题意:给你一个n项的序列,每次可以把序列的首项移动到末尾,显然一共可以构成 n 种序列,问一共有多少种序列满足条件:序列的前 i 项和都大于等于0(i:1~n)。解题思路:这道题我想的复杂了,实际上单调队列的做法并不复杂。求前缀和就可以用sum[j]-sum[i-1],这个式子表示以第i的元素为首位的序列,然后以第j个元素结尾的前缀和。同一个序列的不同结尾的前缀和每次都是减sum[i-1],只

2016-04-29 17:37:38 359

原创 poj 1584(凸包+点在凸多边形内+圆在凸多边形内)

题意:按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包。再给定一个圆形(圆心坐标和半径),判断这个圆是否完全在n边形内部。解题思路:1、判断该多边形是否是凸包,由于题目已经给定了顺时针或逆时针输入,只需判断相邻的三点是否是向左拐或向右拐即可,判断的方法是向量的叉积。2、判断圆心是否在凸包内,假定圆心为O,凸包上任意相邻

2016-04-28 21:32:10 1393

原创 hdu 2215(最小圆覆盖)

解题思路:最小圆覆盖,注意由于树也有半径,所以要加上树的半径0.5#include#include#include#include using namespace std;const double eps=1e-8;struct Point{ double x,y; }p[505];double dis(const Point &a,const Poin

2016-04-28 17:37:16 568

原创 hdu 3007(最小圆覆盖)

题意:给平面上的一些点,用半径最小的圆把所有点覆盖了。1、在点集中任取三个点A、B、C。2、做一个包含ABC三点的最小圆,圆周可能通过这三点,也可能只通过其中两点,但包含第三个点。后一种情况圆周上的两点一定是位于圆周直径的两端。3、在点集中找出距离第2步所建圆圆心最远的D点,若D点在已知的圆内或圆周上,即该圆即为所求的圆,算法结束,否则执行第4步。4、在A、B、C、D中选3

2016-04-28 17:11:12 1348

原创 hdu 2857(对称点与直线交点问题)

Mirror and Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Problem DescriptionThe light travels in a straight line and always goes in the minimal p

2016-04-28 16:24:51 418

原创 hdu 4643(简单计算几何)

GSMTime Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Problem DescriptionXiao Ming is traveling around several cities by train. And the time on the train

2016-04-28 12:49:38 483

原创 hdu 1007(最近点对)

最近点对问题定义:已知上m个点的集合,找出对接近的一对点。     在二维空间里,可用分治法求解最近点对问题。预处理:分别根据点的x轴和y轴坐标进行排序,得到X和Y,很显然此时X和Y中的点就是S中的点。情况(1):点数小于等于三时:                                情况(2):点数大于三时: 

2016-04-28 10:26:49 368

原创 poj 2187(凸包+旋转卡壳)

Beauty ContestTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 33122 Accepted: 10282DescriptionBessie, Farmer John's prize cow, has just won first place

2016-04-27 16:06:48 297

原创 hdu 1392(求凸包周长)

Surround the TreesTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Problem DescriptionThere are a lot of trees in an area. A peasant wants to buy a rope t

2016-04-27 15:02:22 271

原创 hdu 4362(单调队列优化dp)

题意:有m个阶段,每个阶段都有n个龙珠,当在某一阶段选择一个龙珠,该阶段其他龙珠都会消失。给出两个m*n的矩阵,第一个矩阵表示消灭第i个阶段第j个龙珠的位置,第二个矩阵表示取第i个阶段第j个龙珠消耗的能量,同时当第x个位置到第个位置需要消耗 | y - x|的能量。问最后每个阶段取走一个龙珠最小的能量消耗。解题思路:dp[i][j]表示第i个阶段选择第j个龙珠的最小耗能。转移方程:

2016-04-27 14:27:54 445

原创 hdu 1147(线段相交)

这道题跟1086是一样的思路,判断两线段是否相交。用跨立实验即可。#include#include#includeusing namespace std;const int maxn = 100024;struct Segment{ double x1,x2,y1,y2;}s[maxn];int n;bool vis[maxn];bool Segment_I

2016-04-26 21:41:15 524

原创 hdu 1115(多边形重心)

求多边形重心的题目大致有这么几种: 1、质量集中在顶点上     n个顶点坐标为(xi,yi),质量为mi,则重心   X = ∑( xi×mi ) / ∑mi   Y = ∑( yi×mi ) / ∑mi   特殊地,若每个点的质量相同,则   X = ∑xi / n   Y = ∑yi / n 2、质量分布均匀   特殊地,质量均匀的三角形重心:   X

2016-04-26 21:24:50 318

原创 hdu 1086(判断两线段是否相交)

题意:给出一些线段,问有多少个交点。解题思路:这里实际就是一个线段相交的模型,下面这个图给出了思路。如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。上

2016-04-26 11:12:54 502

原创 poj 2373(单调队列优化dp)

在长为L(的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b]。要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必须被某一个喷水头覆盖,而不能由多个喷头分段完全覆盖,求喷水头的最小数目。解题思路:这道题是单调队列优化dp,状态方程很容易想到,关键是优化问题,那么我们就需要维护一个队列放dp[j],使得队列中的元素j至少

2016-04-25 20:28:16 795

原创 poj 1821(单调队列优化dp)

题意:有一道线性篱笆由N个连续的木板组成。有K个工人,你要叫他们给木板涂色。每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到的钱。要注意的是,工人i可以选择不涂任何木板,否则,他的涂色区域必须是连续的一段,并且S[i]必须包含在内。 最后还有,每块木板只能被涂一次。 解题思路:这是一道单调队列优化dp的问题

2016-04-25 17:51:27 472

原创 poj 2355(简单dp)

题意:求两个车站之间的最小费用。解题思路:这道题本来应该是属于线段树优化的dp问题,但是数据太水了,所以O(n²)的复杂度也过了。主要是线段树的话难得打,所以就直接用暴力破了。这里有个坑:a可能大于b。#include#include#includeusing namespace std;const int maxn = 10005;const int inf

2016-04-24 22:47:47 376

原创 poj 1695(三维dp)

题目大意:有3辆车,开始都在点1上,要用这些车把杂志运送到各个城市里,当一个车在转移时,其他两辆车静止,并且两辆车不能跑到同一个位置,分配还得遵循递增的顺序,即城市i有了杂志后,车才能开到i+1城市送杂志。要求所有城市都送到杂志,汽车做过的路程和花费最小解题思路:分析这道题,最重要的状态就是三个车的位置,所以dp[i][j][k]表示三辆车分别在i,j,k时的最大价值,先找到max(i

2016-04-24 10:07:38 365

原创 hdu 1723(简单dp)

题意:从第1个人把信传到第n个人,每个人最多往后传m个人,问传到第n个人有多少种方案。解题思路:水题,dp[i]表示传到第i个人有多少种方案,dp[i] += dp[k], i-m #include#include#includeusing namespace std;const int maxn = 35;int n,m,dp[maxn<<1];int m

2016-04-24 09:58:10 409

原创 poj 1283(递推ordp)

题意:有n台电脑要有k辆卡车去运,每台卡车不能为空,问有多少种运输方案,注:假设有7台电脑,3辆卡车,1,1,5和1,5,1和5,1,1被视为同一种。解题思路:递推思想,dp[i][j]表示i辆卡车运输j台电脑的方案数,可以这么理解,第i辆卡车放1台电脑,dp[i-1][j-1],每一辆卡车至少有两台电脑,dp[i][j-i],所以dp[i][j] = dp[i-1][j-1] + d

2016-04-24 09:24:54 408

原创 hdu 4495(hash+二分+dp)

题意:求一个n*m的矩阵里面的最大的一个对称等腰直角三角形,三角形的腰必须平行于矩阵的边,n,m解题思路:腰平行于矩阵的边,其实也就是做四个方向,首先找到每一个点的最长腰f[i][j],这里可以用二分+hash做。接下来就是找某一个点为顶点的面积最大的等腰直角三角形,dp[i][j]表示以(i,j)为顶点的三角形的最长边。根据题意可以知道,dp[i][j]=min(f[i][j],dp[i-1

2016-04-23 23:08:34 373

原创 hdu 2686(多线程dp)

解题思路:多线程dp,dp[i][j][k][l]表示两条线程分别到达(i,j)和(k,l)时的最大值。注意,我们在处理的时候是不能有两点重合的,所以起点和终点是不会算在内的,最后面还要加上这两点的值。#include#include#includeusing namespace std;const int maxn = 35;int n,m;int map[maxn

2016-04-22 20:19:04 942

原创 nyoj 61(双线程dp)

题目描述:   在一个矩阵内找出两条从1,1到m,n的路径(一条从1,1 到 m,n 一条 从m,n到1,1),并且路径之上的权值之和最大。解题思路:这道题目如果是想从(1,1)->(n,m),再从(n,m)->(1,1)那样肯定会想不清楚。比较好的办法就是看成有两条路从(1,1)->(n,m),这样就可以定义状态 F[i][j][k][l]=max{F[i-1][j][k-1][

2016-04-22 19:36:19 406

原创 hdu 1227(二维dp)

题意:有n个餐馆,k个仓库,问如何放置仓库使得n个餐馆到最近的仓库的总距离最小。解题思路:这道题看似很难,其实仔细想想就是一个水题。如果能够确定仓库的位置,那么就很简单了,关键是如何给仓库定位呢,dp[i][j]表示前i个餐馆,建了j个仓库,且第j个仓库建在第i个餐馆的最小距离。这样我们最后要求的就是dp[n][k] ? 实际是错的,因为第k个仓库不一定会建在第n个餐馆,所以还要枚举第

2016-04-22 13:02:36 284

原创 hdu 5492(矩阵模型的变形)

参考博客:http://blog.csdn.net/u014679804/article/details/48769267#include#include#includeusing namespace std;const int maxn = 35;const int inf = 0x3f3f3f3f;int n,m,map[maxn][maxn];in

2016-04-21 07:52:45 218

原创 poj 1925(坐标上的dp)

题目大意:给出n个建筑,每个建筑以两个数x,y表示,x代表它在横轴上的位置,y代表这个建筑的高度。所有建筑的高度都大于等于第一个建筑的高度。所有建筑输入顺序按照x,y从小到达的顺序排列。蜘蛛侠在第一个建筑上,他要去最后一个建筑救女朋友。一直他每一次摇摆都会到关于建筑对称的位置。求到最后一个建筑的最小摇摆次数。解题思路:一开始以为很容易,dp[i]表示到达第i个建

2016-04-20 20:35:45 358

原创 poj 2397(二分+dp)

题意:蜘蛛侠可以上下跳,问如何跳可以使得达到的最高高度尽可能小。并且最后的位置要在地面。解题思路:首先记录跳的所有高度和sum,蜘蛛侠所能达到的最高高度肯定在1-sum之间(否则不可能做到),标准的二分模型。同时dp[i][j]表示第i次跳到高度为j是否可行。所以dp[i][j]是一个bool变量。这里的状态方程比较好处理,详见代码。求出最小的高度,剩下的就是用dfs去搜索路径,最开始

2016-04-20 16:17:31 309

原创 poj 3459(背包问题)

题意:题目大意是说n个人做m项工程,然后给出工人的薪水,和工程按期完工的概率,以及按时完工的酬劳和未按时完工的罚款,要求出最大利润。。需要注意的 是,薪水输出的是欧元为单位,输出的是以分为单位。解题思路:简单的背包问题,dp[i][j]表示前i个工程,分配j个人完成的最大期望利润。dp[i][j] = max{dp[i-1][k] + cost}, 0 这道题的利润可能为负,所以初

2016-04-20 09:07:47 537

原创 poj 3920(简单dp)

题意:从起点每次#include#include#includeusing namespace std;const int maxn = 205;const int inf = 0x7ffffff;int n,s,t;int grid[maxn],dp[maxn][maxn];int main(){ while(scanf("%d",&n)!=EOF) {

2016-04-19 20:31:11 393

原创 poj 3257(哈希+二维dp)

题意:要连出一个从1-L的过山车线,给出n段可选的建设方案。每段都有起始位置,终止位置,代价,和乐趣程度。要实现1-L的长度中,相邻两端要首尾相连,总建设代价控制在B之内,问最多能获得多少乐趣程度。解题思路:这里有两个限制条件,L和B,最开始的思维可能是dp[i][j][k]表示前i段,修的长度为j,花费为k的最大价值。但根据数据量,这样肯定会超时。这里同样有一个条件要仔细挖掘,相邻两

2016-04-19 12:42:09 333

原创 poj 3797(状态压缩dp)

题意:4*n的木板,用1*2方块去贴,问一共有多少种方案。解题思路:这道题是简单的状态压缩,和之前的铺方块是一样的思路,横着的为全1,如果有空格等着下一行去铺就置0,那么下一行的这个位置肯定为1,因为要竖着插把上一行的填满。剩下的就是简单的状态转移了。#include#include#includeusing namespace std;const int max

2016-04-18 21:14:45 410

原创 hdu 3006(状态压缩)

题意:给一些集合,取一部分集合合并能够得到多少个新集合。解题思路:这道题数字最多只有14,可以用状态压缩去做,每一位代表某个数,0代表不取,1代表取这个数。剩下的就是去模拟状态了。不多讲,输入状态压缩入门题。#include#include#includeusing namespace std;const int maxn = 105;int n,m,Set[m

2016-04-18 13:08:40 247

原创 hdu 1712(分组背包)

题意:有N个课程,然后选择M天内学习的效益最大值,注意每个课程最多选取一次。解题思路:裸的分组背包,把每门课程看做是每一组,每一组里面最多选择一个天数,典型的分组背包。详见背包九讲#include#include#includeusing namespace std;const int maxn = 105;int n,m,map[maxn][maxn];in

2016-04-17 13:21:51 204

原创 hdu 1080(LCS变形)

解题思路:这道题最开始看错题了,以为只能给长度小的那个字符串添加'-',就往“编辑距离”这个模型去想。其实这里是两个串都可以添加'-',所以模型一下子就简化了。这里可以用LCS的思路去做。dp[i][j]表示两个串分别是前i个和前j个的最大价值。dp[i][j] = max(dp[i-1][j-1] + score[A[i]][B[j]],max(dp[i-1][j] + score[A[

2016-04-16 22:46:33 282

原创 hdu 1692(枚举+剪枝)

题意:给你一些井的信息,井中原有的水,当井中的水满足一定量后会被破坏并且这些水全部流入下一个井中,用多少能量能直接破坏这个井。然后问要想破坏第n口井至少要多少能量。解题思路:这题首先是要找到从哪口井开始破坏,因为要破坏第n口井,要么直接破坏n,要么n之前有连续的几口井一同被破坏,如果中间出现了一个不破坏的井,那么之前的能量就浪费了。一般的思路肯定是两层循环就搞定,但看到这个数据量有点怕超时

2016-04-16 13:07:17 697

原创 hdu 1574(01背包)

RP问题Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Problem Description在人类社会中,任何个体都具有人品,人品有各种不同的形式,可以从一种形式转换为另一种形式,从一个个体传递给另一个个体,在转换和传递的过程中,人品不会消失,也不被能创造

2016-04-15 22:56:00 603

原创 hdu 3449(依赖背包)

题意:每一组物品都有一个盒子,要买该组的物品必须先要买盒子,问能够获得的价值最大是多少。解题思路:这题有点像分组背包,但是每一组里面要买物品必须要先买盒子。其实我的想法还是和分组背包的思路一样,只是把盒子看成一个单独的物品,dp[i][j]表示前i组物品,容量为j时的最大价值。为了防止盒子没有买就买了这一组的物品,我们最开始的dp[i][j]赋值为-1,在该组里做一次01背包,同样,还

2016-04-15 21:47:27 417

原创 hdu 3033(分组背包)

题意:有S款运动鞋,一个n件,总钱数为m,求不超过总钱数且每款鞋子至少买一双的情况下,使价值最大。如果 有一款买不到,就输出“Impossible"。解题思路:分组背包,和背包九讲里面不同的是,这里要每一组至少有一个。为了保证每一组都有被取,dp[i][j]初始化为-1,表示前i组,背包容量为j时可获得的最大价值。在每一组中选择时,一定要注意这一组的物品是第一次选,还是之前已经选了多个物品。

2016-04-14 22:37:14 390

原创 poj 2288(状态压缩dp + TSP问题)

题目描述:哈密尔顿路问题。n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算:1.每一个点的权值之和2.对于图中的每一条CiCi+1,加上Vi*Vi+13.对于路径中的连续三个点:CiCi+1Ci+2,若在图中,三点构成三角形,则要加上Vi*Vi+1*Vi+2求一条汉密尔顿路可以获得的最大值,并且还要输出有多少条这

2016-04-14 20:28:28 370

空空如也

空空如也

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

TA关注的人

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