自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 uvalive 4973

题意:给出空间两条线段,求他们的最近距离的平方,要用分数形式表示 : l / m两个互质数 其中m>0。 题解:有两种情况,如果两条线段平行或重合,直接计算线段每个端点到另一条线段的距离,取最小值。否则就是异面直线,模板函数带入进行了。。。因为一个变量名坑了一下午加一晚上。。。而且要用数字要用存long long。。。#include <cstdio>#include <cstring>#in

2015-07-31 21:26:41 523

原创 uva 11275

题意:三维空间有两个三角形,问两者是否有公共点。 题解:如果相交,三角形的某条边一定经过另一个三角形的内部,边上,或者顶点。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const double eps = 1e-8;const double PI =

2015-07-31 15:41:40 423

原创 uva 12296(切割凸多边形)

题意:有一个长l宽w的矩形,左下角坐标是(0,0),现在有n条线段把这个矩形切割,保证每条线段的两个端点落在矩形不同的边上,把矩形分成了若干区域,现在有m个圆画进矩形,问圆覆盖了哪些区域,并把这些区域的面积排序输出。 题解:先要切割矩形,方法是每读入一条线段都拿去处理切割出的新的区域把原先的区域替换,最后可以得到一个区域的vector,然后判断圆和区域的情况: 1.如果圆没有公共点,可以是圆在某

2015-07-31 09:13:55 999

原创 uvalive 3218

题意:一条封闭折线将平面分成了若干个区域,按顺序给出折线各点的坐标,要求输出封闭折线的轮廓。 题解:用类似卷包裹的算法,先确定一个一定会被选中的点(x坐标最小,y坐标最小)作为起点,然后把可能是下一个极点(凸包顶点)的点都存起来,下一个极点有可能是当前点所在线段的前一个点和后一个点或当前点所在线段和其他线段的有交点的线段的起点和终点。 找出最右侧的点(用角度判断)和当前点的连线是否和其他线段有交

2015-07-30 19:47:36 712

原创 uvalive 2797

题意:给出n条线段的左右端点的坐标,然后(0,0)处有一个怪兽,线段成为了他逃脱的障碍,问这个怪兽是否能逃到无穷远处, 题解:用图论的方法把图中u,v连线不和其他线段规范相交的u,v看做连通,最后看起点和终点(坐标很远的一个点)是否是连通的,需要把每条线段都延长一点,因为线段与线段相交的点其实是不能通过的但普通处理方式认为可连通,还有就是如果有公共端点的共线线段,端点不能加到图的结点中。#incl

2015-07-30 11:57:06 709

原创 uvalive 4992(半平面交+二分)

题意:丛林里有n个瞭望塔,组成了一个凸多边形,瞭望塔可以保护这个凸多边形内的任意一点,总部就设在凸多边形内的某一点,敌人会炸掉瞭望塔使总部不再被剩下的塔监视到,现在要选择一个最优的总部位置,输出敌人需要炸毁的瞭望塔的数目。 题解:二分出需要炸的数目然后把剩下的塔拿去半平面交看是否还有交集,可以想到如果有两颗炸弹,敌人会选择连续的两个顶点炸,因为这样损失的面积更大(梯形面积大于三角形。。。),然后我

2015-07-29 19:49:35 632

原创 uvalive 2218

题意:一场运动比赛有三个阶段,给出了每个选手在每个阶段的平均速度,可以自行设计每场比赛的长度,让某个选手获胜,判断每个选手是否有可能获胜。 题解:把题意转化为一个不等式,设比赛长度是1,如果i要战胜j,x、y分别是第一阶段和第二阶段的比赛长度: (x / ui + y / vi + (1-x-y) / wi) < (x / uj + y / vj + (1-x-y) / wj) 可以转化为Ax

2015-07-29 16:34:01 460

原创 uvalive 3890

题意:有一个n个点的凸包多边形,在这个多边形内找一点到多边形边界的距离最远,输出最远距离。 题解:利用半平面交求多边形的内核,二分出距离,多边形的每条边都按这个距离向内推进,如果有交点就继续推进。 http://blog.csdn.net/accry/article/details/6070621这里的半平面交讲的不错。#include <cstdio>#include <cstring>#

2015-07-29 12:35:45 520

原创 uvalive 4728(旋转卡壳求凸包最长直径)

题意:有n个正方形,给出了左下角坐标和边长,问在他们的顶点中距离最大的两个点的距离的平方。 题解:首先想到用凸包可以减少点的数量,然后两两枚举比较长度,这种方法也是O(n^2),所以有了一种新的方法叫做旋转卡(qia)壳,http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html,这里讲的比较好理解。#include <cstdio>

2015-07-28 23:11:32 536

原创 uva 10256(凸包)

题意:给出n个红点和m个蓝点的坐标,是否存在一条直线,使得取一个红点和一个蓝点都是在直线的异侧。 题解:明显是要判断两个凸包是否有交集,要判断两个凸包的边是否相交,还要判断红点是否在蓝点凸包内部,蓝点是否在红点凸包内部。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace

2015-07-28 18:10:57 604

原创 uva 11168

题意:有n个点,找一条直线,让所有点都在直线的同一侧(也可在直线上),且到直线的距离之和最小。输出距离和与点数的比值。 题解:所有点在直线同侧,也就是直线不能穿过凸包,那么凸包的边所在直线就是可能的解,点(x0,y0)到直线(Ax + By + C = 0)的距离 dis = |Ax0 + By0 + C| / sqrt(A^2 + B^2) 把凸包的每个边拿去计算,所有点到其的距离和,根据计

2015-07-28 15:47:30 691

原创 uva 10652(凸包)

题意:有n块矩形木板,用一个面积尽量小的凸多边形把它们包起来,并计算出木板占整个包装面积的百分比。 题解:把每个木板旋转后的四个点加入集合,最后就有4×n个点的点集,然后问题转化为普通的凸包问题就容易解决了。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;

2015-07-28 14:45:21 509

原创 uvalive 2572

题意:把n个圆盘依次放到桌面上,按放的顺序给出每个圆盘的坐标和半径,问最后多少个圆盘可见。 题解:如果把所有圆盘放好,基本上看到的都是完整的圆盘或者一些圆弧,那么把每一个圆盘和其他圆盘的交点求出来,每两个相邻的交点之间的圆弧也就可以得到,然后把这个圆弧的中点P往内外各移动一个很小的距离,得到P’和P”,把包含这两个点的最顶部的圆盘视为可见。注意很小的距离的取值。#include <cstdio>

2015-07-28 13:20:31 531

原创 uva 12304(圆的相关函数模板)

题意:要求解答6个关于圆的问题。 1.给出三角形坐标求外接圆 2.给出三角形坐标求内切圆 3.给出一个圆心和半径已知的圆,求过点(x,y)的所有和这个圆相切的直线 4.求所有和已知直线相切的过定点(x,y)的已知半径的圆的圆心 5.给出两个不平行的直线,求所有半径为r的同时和这两个直线相切的圆 6.给定两个相离的圆,求出所有和这两个圆外切的半径为r的圆。 题解:花了一天做这个,就当整理

2015-07-27 19:46:16 975

原创 uva 11796

题意:两只狗分别沿一条折线跑,速度未知,但同时出发同时到达,分别给出两条折线的各点坐标,问两只狗在跑的过程中的最远距离和最近距离差。 题解:如果两只狗跑的都是线段,问题会更容易解决,可以把其中一点当做静止,另一个做相对运动,就可以求出这个过程的最远最近距离,然后如果是走折线,两个点先到拐点的之前的时间段就是前面说的简化过程,也就是把整个过程划分为好多个简化过程阶段。#include <stdio.

2015-07-27 00:05:48 1108

原创 uvalive 3263

题意:平面上有一个包含n个端点的一笔画,第n个端点和第一个端点重合,因此图案是一个闭合曲线,组成的线段可以相交但不重叠,问这些线段将平面切成多少部分。 注意输入的时候输入了n+1个点,最后一个点是起点。 题解:欧拉定理:平面图的顶点数V,边数E,面数F的关系是 V + F - E = 2 有了这个定理,计算一下新增的点(任意两边求交点),然后每个新增的点在现有的线段上就新增一条边,注意点判重。

2015-07-26 13:04:33 382

原创 uva 11178

题意:作三角形ABC每个内角的三等分线,相交乘三角形DEF,则DEF是等边三角形。已知A,B,C三点坐标,问D,E,F三点坐标。 题解:用对于点D,是向量BC逆时针旋转∠ABC的三分之一的直线与向量CB逆时针旋转∠ACB的三分之一的直线的交点,坐标都有了,可以直接计算。#include <stdio.h>#include <string.h>#include <math.h>#include

2015-07-26 12:10:25 842

原创 uva 1379(dp)

题意:有n个人要和m个敌人打比赛,要打g场比赛,每天最多打一场,持续g+10天,然后给出n个人中每个人打敌人的胜率,且一个人打了比赛后需要休息4天,然后给出第i天要打的敌人序号,0表示不打,问最多能得多少分(胜率累加和)。 题解:dp的思路比较好想,f[i][x][j][k][l]表示在第i天,第i-1天是第x个人打的,第i-2天是第j个人打的,第i-3天是第k个人打的,第i-4天是第l个人打的情

2015-07-26 00:20:50 758

原创 uva 1347(双调欧几里得旅行商问题)

题意:一个人要去n个地方旅行,给出n个点的坐标,他会从最左边的点走到最右边,然后再回到起点,除了最左边和最右边两个点,每个点只经过一次。问最短路。 题解:f[i][j]表示从i到1再从1到j连通的最短路。 状态转移方程: f[i][j] = f[i - 1][j] + dist(p[i - 1], p[i]) f[i][i - 1] = min(f[i][i - 1], f[i - 1][j

2015-07-25 17:29:58 629

原创 uva 1414(dp)

题意:汉诺塔问题,把A柱上n个圆盘全部移到B或C柱需要的步数,不同的是给出了一个序列,AB表示把A柱顶部的圆盘移到B柱顶上(按规则),这个序列每次从左到右扫描,找到可执行的第一个指令就执行一次,然后再从头扫描,同一个圆盘不能连续移动两次。问步数。 题解:因为序列给出,移动的顺序就是固定的,可以推出来。在序列不变的情况下,随着圆盘数量的增加,移动次数线性增加,可以得到如下递推式 f(1) = 1

2015-07-25 14:54:31 818

原创 uva 12223(树形dp)

题意:一个城市有n个景点,景点和景点之间的路线形成一棵无根树(也就是有n-1条边),给出景点之间的花费,一个人可以任选一个景点住在那里,然后他每年都要固定去m个景点,给出这m个景点和要去的次数,这个人每次去了景点都会回家,问他一年为了观赏景点最少花费多少钱。 题解:想了好久,看看题解才完全理解。要先把无根树转化成有根树,默认让1成为根节点,然后先dfs把每个节点v当做根节点的子树的节点数统计一下在

2015-07-22 20:54:23 537

原创 uva 12222(dp)

题意:有一条单行道,A、B两端都会有车要通过,现在给出n辆车,每个车出发地点、出发时间、通过这条道路的时间,问最后一辆车离开这条路的最小时间点。注意,相向而行的车不能同时在路上,而同向的车之间保证有10秒的差距,也就是路上的任意一点在10秒内只能经过一辆车。 题解:考虑到单行道两边都有车,那么可以从两端车的状态入手,f[i][j][k]表示A端前i辆车、B端前j辆车已离开后,此时再有车从k端进入的

2015-07-22 12:34:10 1194

原创 uva 1474(dp)

题意:有n个队伍修路,有m个避难所,编号从1开始,给出了每个队伍和避难所的位置,每个队伍和避难所之间的距离是|a[i] - b[j]|,如果为每一个队伍分配避难所,且每个避难所至少被分配一个队伍,问每个队伍和自己的避难所之间最短距离和是多少,给出每个队伍分配的避难所编号。 题解:dp的状态很好找,因为距离差要最短,所以先把位置都排序,f[i][j]表示前i个队伍前j个避难所分配后的最短距离和。

2015-07-21 21:18:20 540

原创 uva 11600(期望dp)

题意:有n个城市,编号为1~n,城市两两直接都有一条双向道路(一共n(n-1)/2条),有m条路是安全的,其他的路上都有妖怪。为了让城市两两可达,有一个捉妖者第一天晚上住在城市1,然后每个白天随机选择一个新的城市,顺着能到达新城市的道路上把妖怪收服,晚上住在新城市。问需要多少个白天才能让任意两个城市之间存在一条路径上没有妖怪而相互可达。 题解:让任意两两城市可达,那就是让图成为连通图的问题。城市最

2015-07-21 12:38:46 775

原创 uva 12235(dp)

题意:有n本书放一排在书架上,每本书都有一个高度h,高度连续相等的一段算一个val,书的mess value计算方式就是看有多少个val,然后让最多拿出k本书,再任意放入使mess value最少,问最优的mess value是多少。 题解:和队友yy了四维的dp,敲了半天还是弄不出来,看了题解发现思路是对的。。。f[i][j][s][k]表示前i本书拿走j本,剩下的书的状态s(二进制),最后一本

2015-07-21 00:48:12 810

原创 uva 1407(树形dp)

题意:有一个机器人从一个节点进入一棵树,给出n个节点之间的距离,如果机器人的能量为x,也就是最多走x,且机器人不需要回到起点,问机器人最多能走多少个节点。 题解: f[i][j][0] : 遍历子树i的j个节点且最后不需要回到子树的根节点i最少用多少能量 f[i][j][1]:遍历子树i的j个节点且最后回到子树的根节点i最少用多少能量 首先要遍历出每个节点i有多少个子节点childnum[i

2015-07-20 14:25:38 726

原创 uva 1427(单调队列优化dp)

题意:一个城市有n+1个横向路和m+1个纵向路,一个国王从最北边的进入,然后沿某种路线从最南边出去,每小段横向路都有一个高兴值,但国王不会在某条横向路待超过k分钟,问国王可以得到的最大的高兴值是多少。题解:f[i][j]表示走前i行前j列的最大高兴值,因为从最北边进入的方式有两种:从左进入或从右进入,所以要分情况讨论。直接针对每个点来算左右两方向会超时,这题想到用到队列优化比较难,看了这位大神的题解

2015-07-20 00:17:38 537

原创 uva 12260(dp)

题意:有两个人Petra和Jan要分n个零食吃,每个人对不同的零食有不同的喜爱程度,然后两个人先用硬币决定谁第一个开始选择,然后轮流选择零食拿走,Petra每次都会选择当前剩下的自己最喜欢的零食,如果有喜爱程度相同的就选择对方更不喜欢的那个,Jan每次选择都会让自己最后得到所有零食的总满意度最高,如果有不同的选择让自己最后的总满意值相同,会选择让对方最后的总满意度更高。 最后输出Petra和Jan

2015-07-19 01:56:49 677

原创 uva 672(dp)

题意:有n个歹徒要进入一家餐厅,餐厅有一扇门,门初始大小是0,门会每秒增大1或减小1或不变,但范围在[0,k],然后每个歹徒都有到达餐厅的时间ti,每个人有一个财富值pi和自己的体型值si,只有歹徒到达餐厅时门的大小和si相等时他才能进入餐厅,餐厅就会增加pi,问餐厅最多增加的总pi值是多少。 题解:f[i]表示前i个人能让餐厅增加的总Pi值是多少,先把歹徒到餐厅的时间排序,然后对比歹徒间到达时间

2015-07-18 15:32:47 705

原创 uva 473(dp)

题意:按创作时间给出n首歌每首歌的时间ti,然后按创作时间装到m个光盘内,给出光盘最大分钟数t,问m个光盘最多总共放多少首歌。 题解:对于每首歌都可以选或者不选,如果选择了这首歌,是否把这首歌当做第j张光盘的第一首歌。f[i][j][k]表示前i首歌放到第j张光盘里用分钟数是k的容量最多放多少首歌。 f[i][j][k] = f[i - 1][j][k]表示要选这首歌 f[i][j][k] =

2015-07-18 10:18:21 732

原创 uva 10254(四柱汉诺塔)

题意:给出四柱汉诺塔上初始柱子上圆盘的数量n,问最优多少次移动可以移动到另一个柱子上。 题解:可以参考四柱汉诺塔之初步探究和四柱汉诺塔实现这两篇论文,理解四柱汉诺塔的原理。 但是这道题n是从1到10000,递归太多层,而且需要用到大数,所以要找规律,f[i] = f[i - 1] + 2^k,k从1开始每k+1次计算f[i]后增大1,初始f[1] = 1。import java.math.Bi

2015-07-18 09:33:50 962 1

原创 uva 1252(状态压缩dp)

题意:有n个二进制串,长度都是m且都不相同,问最少询问多少个问题可以把这n个串完全区分开。 题解:1<=m<=11,从这个范围就可以推测是状态压缩,那么dp肯定要有一维表示提问的问题,然后另一位就是根据提出的问题把串分类,一种是符合提出的问题的状态,另一种不符合。这样f[i][j]表示在问了问题i的状态下答案是状态j时还要提出多少个问题才能把所有串区分开。 如果找到在问题i下和答案j相同的串只有

2015-07-16 21:28:49 743

原创 uva 1291(dp)

题意:有一台跳舞机,中间是0,上左下右分别代表1 2 3 4,初始状态人站在中间,两只脚都踏在0上,然后给出一段序列以0为结束,要按顺序踩出来,从0踏到四个方向需要消耗2点能量,从一个方向到相邻的方向消耗3点能量,从一个方向到对面方向消耗4点能量,在一个方向原地再踩一次消耗1点能量,问把所有序列踩完最少消耗多少能量。 题解:f[i][j][k]表示踩前i步左脚在方向j上右脚在方向k上最少消耗多少能

2015-07-16 15:44:03 626

原创 uva 1292(树形dp)

题意:有一个树,上面有n个结点,给出每个结点有边相连的直接相邻的点,问最少选几个点能让所有的边至少有一个结点被选中。 题解:树形dp#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>using namespace std;const int N = 1505;int n, f[N][2],

2015-07-16 00:04:11 684

原创 uva 1366(dp)

题意:有一个n*m的格子,每个格子里有A矿和B矿,A矿必须由右向左运输,B矿必须由下向上运输,给出两种矿在格子内的数量,挖矿人在每个格子里只能选一种矿挖,而且在格子内建运输管道不能拐弯或间断且都能通到格子外面。问最后能收集到的矿的总数最多多少。 题解:f[i][j][k]表示在前i行前j列第i行第j列挖k矿的最大数量,那么分两种情况 (1)第i行第j列挖A矿,那么(i,j)一定左边全是A矿,(i

2015-07-15 20:49:00 595

原创 uva 1452(约瑟夫变形)

题意:有1到n顺时针坐在圆桌上,编号从1到n,从1开始顺时针报数,每k个出去一个人,输出倒数第三个出去、倒数第二个出去、倒数第一个出去的人的编号。 题解:n的范围是500000,肯定不能用链表来解,这就用到了约瑟夫问题的递推式:f[i] = (f[i - 1] + k) % i,初始f[1] = 0表示还剩1个人的时候最后出去的人编号一定是0(这里默认编号从0开始),那么根据递推式可以得到f[n]

2015-07-15 16:06:59 614

原创 uva 11795(状态压缩dp)

题意:有一个机器人要杀死其他n(1 <= n <= 16)个机器人,他自己配备了一个武器,并且给出了这个武器能杀死的敌人,如101表示他能杀死第1和第3个敌人,这样他就能得到第1和第3号敌人的武器,从而杀死更多的敌人,问他杀死所有的敌人的方法数。 题解:因为敌人数最多是16个,很容易想到应该是状态压缩dp,可以用f[S]表示状态S下进制位为1的敌人全被杀死的方案数,那么结果就是f[(1 << n)

2015-07-15 11:53:11 635

原创 uva 1456(dp)

题意:有n个数字u1,u2,u3…un,每个数字出现的概率pi = ui/(u1 + u2 + … + un),分成w组,计算期望值。 第一组样例的五个数字如下 30 5 10 30 25 分成2组 如果分成{u1, u2, u3}和{u4,u5} 期望值 = 3 * (p1 + p2 + p3) + (3 + 2) * (p4 + p5) 如果分成{u1,u4}和{u2,u3,u5}

2015-07-14 23:31:38 566

原创 uva 10120(暴力+结论)

题意:有一只青蛙要从左岸跳到河中的n个石头中的第m(m <= n)个石头上拿礼物,石头间距和石头距离岸的距离都是1,青蛙在石头上可以向左跳也可以向右跳,但有一个规则是它跳的第i步长度必须是2*i-1,如果期间跳到岸上则不能拿到礼物,给出n、m问是否能拿到礼物。 题解:用递归可以解决,但是n的范围是1000000,所以肯定挂,然后看到一个结论是如果n大于等于49后,无论m是多少,一定可以跳到,用这个

2015-07-14 17:49:24 670

原创 uva 11127(暴力)

题意:给出一个字符串,包括0、1、*,其中×是可以替换成0或者1的,如果字符串的某个子串S有SSS这样的连续重复3次出现,不是Triple-free串,问给出的字符串可以形成多少个非Triple-free串。 题解:因为串长度最多31,所以可以暴力枚举每一位,边枚举边判断。#include <stdio.h>#include <string.h>const int N = 35;char s

2015-07-14 14:59:35 618

空空如也

空空如也

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

TA关注的人

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