
UVA(训练指南)
文章平均质量分 67
Wall_F
这个作者很懒,什么都没留下…
展开
-
UVA 11374 Airport Express
大意略。思路:Dijkstra预处理起点到任意一点的距离,终点到任意一点的距离,然后通过枚举商业路线确定最优路径,输出通过递归来实现即可。WA了很多次,Uva论坛里的测试数据我全过了,还是不知道哪里错了。求测试数据,别复制代码。#include #include #include #include #include #include #include #inclu原创 2013-03-31 17:54:26 · 1176 阅读 · 0 评论 -
UVA 11324 The Largest Clique
题目大意:给一张有向图,求一个结点数最大的结点集,使得该结点集中的任意两个结点u和v满足:要么u可以达v,要么v可以达u,(u,v相互可达也行)。思路:不难发现,如果要使得结点数最大,那么同一个强连通分量中的点,要么全选,要么全不选,让每一个SCC结点的权等于它的结点数,则题目可以转换为求SCC图上权的最长路径,SCC图是DAG图,可以同动态规划求解。一开始,Tarjan写错了,WA了2次原创 2013-01-19 13:18:45 · 825 阅读 · 0 评论 -
UVA 1401 Remember the Word & LA 3942
大意:给出一个有S个不同单词组成的字典和一个字符串。把这个字符串分解成若干个单词的连接,有多少种方法?思路:令d[i]表示以字符i结束的字符串的分解方案数,即d[i+j] = sum(d[i]) (j为一个单词的长度),初始化d[0] = 1;把所有单词组成Trie,然后试着在Trie中查找单词即可。#include #include #include using name原创 2013-02-21 14:17:26 · 1771 阅读 · 0 评论 -
UVA 11275 3D Triangles
大意略。简单的三维空间判三角形相交。#include #include #include #include #include #include #include #include #include #include using namespace std;struct Point3{ double x, y, z; Point3(原创 2013-04-09 09:43:17 · 1086 阅读 · 0 评论 -
UVA 1304 Art Gallery
大意略。思路:即求多边形的内核,用半平面交即可。#include #include #include #include #include #include #include #include #include #include using namespace std;const double eps = 1e-8;const double原创 2013-04-08 21:51:51 · 963 阅读 · 0 评论 -
LA 2453 Wall
大意:给定一个n边形城堡,在它的外部构造一个总长度尽量小的围墙,使得围墙的任何一部分离城堡的距离都不小于L。思路:通过观察可以发现先求凸包,求得凸包之后,绕凸包先把原有的线段平移,即是凸包的周长,但这还不够,弧的长度没有加,其余的长度可以发现是以给定的L圆的周长,绕着凸包走360度加起来的弧长度就是整个圆的周长。#include #include #include #inclu原创 2013-04-08 20:48:07 · 927 阅读 · 0 评论 -
UVA 11549 Calculator Conundrum
大意略。思路:可以发现有循环节,之后在循环节中找最大的即可,可过STL或者哈希表来判重,另一种巧妙的方法是通过Floyd判圈算法来实现。通过这题熟悉了C++的stringstream和Floyd判圈算法。哈希表:#include #include #include #include #include #include #include原创 2013-04-09 22:08:03 · 974 阅读 · 0 评论 -
UVA 11078 Open Credit System
大意:找出两个整数Ai和Aj,使得Ai-Aj尽量大。思路:最直接是两重暴力,或者维护j相等时(1#include #include #include #include #include #include #include #include #include #include #include原创 2013-04-09 22:11:37 · 1335 阅读 · 0 评论 -
UVA 11292 Dragon of Loowater
大意略。#include #include #include #include #include #include #include #include #include #include #include using namespace std; const int maxn = 20010;int A[ma原创 2013-04-09 22:32:41 · 999 阅读 · 0 评论 -
UVA 1160 X-Plosives
大意略。#include #include #include #include #include #include #include #include #include #include using namespace std;const int maxn = 100010;int pa[maxn];void init(){ for(int i = 0; i原创 2013-03-27 20:19:59 · 1266 阅读 · 0 评论 -
UVA 11991 Easy Problem from Rujia Liu?
大意略。原来map可以插vector额。#include #include #include using namespace std;map > a;int n, m;int k, v;void init(){ a.clear();}int main(){ while(~scanf("%d%d", &n, &m)) { init(); for(原创 2013-03-27 17:03:29 · 819 阅读 · 0 评论 -
UVA 11729 Commando War
大意略。思路:要时间最短,即要求尽量多的任务并发进行,则把执行时间由大到小排序即可。#include #include #include #include #include #include #include #include #include #include #include using namespace s原创 2013-04-10 17:24:18 · 1360 阅读 · 0 评论 -
UVA 1203 Argus
大意略。优先队列模拟。#include #include #include #include #include #include #include #include #include #include using namespace std;const int maxn = 1010;char str[maxn];int n;struct Argus{原创 2013-03-27 22:29:07 · 853 阅读 · 0 评论 -
UVA 11636 Hello World!
大意略。思路:推数据。#include #include #include #include #include #include #include #include #include #include using namespace std;int main(){ int times = 0; int n; while(scanf("%d", &n) &&原创 2013-04-11 21:25:35 · 1062 阅读 · 0 评论 -
LA 3213 Ancient Cipher
大意略。#include #include #include #include #include #include #include #include #include #include using namespace std;const int maxn = 1010;const int sigma_size = 26;char s原创 2013-04-11 21:26:31 · 1321 阅读 · 0 评论 -
UVA 10635 Prince and Princess
大意:求出A串和B串的最长公共子序列。思路:由于数据量比较大,p,q->250^2 = 62500.所以一般的解法是过不了的,在一看题目,发现两两元素各不相同,于是可以把A中元素重新编号为1~p+1。然后去B中找最长上升子序列即可,具体的可以手推一遍。#include #include #include #include #include #include us原创 2013-01-19 11:12:16 · 1375 阅读 · 0 评论 -
UVA 10905 Children's Game
大意不再赘述。思路:这可以用到C++中STL的排序与重载,技巧性比较强,有点贪心的味道在里面。#include #include #include #include #include #include using namespace std;const int MAXN = 60;string str[MAXN];int n;in原创 2013-01-18 18:18:02 · 1333 阅读 · 0 评论 -
UVA 11796 Dog Distance
大意:甲和乙分别沿着一条直线奔跑。两只狗的速度未知,但已知他们同时出发,同时到达,求它们在奔跑过程中的最远距离与最近距离之差。思路:由于运动是相对的,因此可以求出甲和乙的相对位移量,认为甲不动,乙静止沿着直线走,因此问题转换为求点到线段的最小或者最大距离。然后模拟整个过程即可。#include #include #include #include #include #i原创 2013-04-07 08:54:25 · 1200 阅读 · 0 评论 -
UVA 10917 Walk Through the Forest
大意:Jimmy下班后需要穿过一个森林。他只沿着满足如下条件的道路(A,B)走:存在一条从B出发回家的路径,比所有从A出发回家的路径都短。你的任务是计算有多少条不同的路径。思路:以终点做一遍最短路径,当d[B]B,题目的目标就是求出起点到终点的路径条数,由于是DAG图,可以用动态规划的方法去写。f[i]表示从i出发走到终点的不同路径的条数,边界条件是f[end] = 1,可以用记忆化搜索去原创 2013-03-31 21:39:28 · 1034 阅读 · 0 评论 -
UVA 1342 That Nice Euler Circuit
大意:平面上有n个端点的一笔画,第n个端点总是和第一个端点重合。按照顺序给你一些点,然后通过铅笔的移动跟随点的移动从而画出移动的痕迹,保证后一条线段不覆盖前一条线段,问这些线段将平面分成多少部分?思路:欧拉定理:平面顶点数V、边数E和面数F,则V+F-E = 2;这样只需求出顶点数V和边数E,这样就可以求出F = E+2-V。设平面的结点由两部分组成,即原来的结点和新增的结点,由于原创 2013-04-02 09:37:47 · 890 阅读 · 0 评论 -
UVA 11178 Morley's Theorem
大意:做三角形ABC每个内角额三等分线,相交成三角形DEF,则三角形DEF是等边三角形。你的任务是根据A、B、C三个点的位置确定D、E、F的位置。思路:求出#include #include #include #include #include #include #include #include #include using namespace std原创 2013-04-01 18:40:14 · 878 阅读 · 0 评论 -
UVA 10652 Board Wrapping
大意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们包起来,并计算出木板站整个包装面积的百分比。思路:按照题意将所有矩形顶点坐标存起来,旋转时先旋转从中心出发的向量,求得各个坐标之后,求凸包即可。#include #include #include #include #include #include #include #include #inc原创 2013-04-03 20:27:41 · 1270 阅读 · 0 评论 -
UVA 11168 Airport
大意:给出平面上n个点,找一条直线,使得所有点在直线的同侧(也可以再直线上),且到直线的距离之和尽可能小。思路:要求所有点在直线同侧,因此直线不能穿过凸包。不难发现,选择凸包上的边所在的直线是最优的。关键是求所有点到直线的距离,我们可以枚举每一条凸包上的边,把直线用点斜式表示出来,然后通过一般式求出所有点到直线的总距离。由于所有点在Ax+By+C = 0的同一侧,所有的Ax0+By0+C的原创 2013-04-04 16:47:15 · 1213 阅读 · 1 评论 -
UVA 11437 Triangle Fun
大意略。思路:我的思路比较蠢,把所有坐标求出来,然后再求直线与直线的交点,最后通过叉积算面积即可。坐标可以通过向量定比分点公式计算:#include #include #include #include #include #include #include #include #include #include using namespace原创 2013-04-03 22:37:59 · 945 阅读 · 0 评论 -
UVA 10256 The Great Divide
大意:平面上有n个Majestix(红点)和m个Cleverdix(蓝点),是否存在一条直线,使得任取一个红点和一个蓝点都在直线的异侧?这条直线不能穿过红点或蓝点?思路:分离两个点集的充要条件是分离两个凸包,首先求出两个凸包。然后判断这两个凸包是否有公共部分,则只需:1、判断任何一个红点不在蓝点的内部,蓝点类似。2、红凸包上的任意一条边与蓝凸包没有交点(包括端点)。判断1时,判原创 2013-04-05 11:41:28 · 921 阅读 · 0 评论 -
UVA 11646 Athletics Track
大意略。思路:被告知两段圆弧在同一圆上,则圆是矩形的外接圆,求出圆心角后求出弧长即可。#include #include #include #include #include #include #include #include #include #include using namespace std;const double eps =原创 2013-04-05 19:17:05 · 856 阅读 · 0 评论 -
UVA 1453 Squares
大意略。思路:十万个点,如果直接枚举顶点的话会超时。可以求出凸包后,然后再枚举两个顶点,极限情况下也是O(n^2),竟然被我水过去了。正解是通过旋转卡壳的方法求凸包顶点之间的最小距离。先贴暴力代码,然后去学习旋转卡壳:http://cgm.cs.mcgill.ca/~orm/rotcal.frame.html#include #include #include #inc原创 2013-04-05 19:20:11 · 934 阅读 · 0 评论 -
UVA 11039 Building designing
大意:n个绝对值各不相同的非0整数,选出尽量多的数,排成一个序列,使得正负号交替且绝对值递增。思路:按照绝对值大小排一次序,然后扫描一次,顺便做个标记即可。#include #include #include #include #include #include #include using namespace std;const int MAXN原创 2013-01-18 18:13:39 · 1508 阅读 · 0 评论 -
UVA 1396 Most Distant Point from the Sea
大意:在大海中央,有一个凸n边形的小岛。你的任务是求出岛上离海最远的点,输出它的距离。思路:二分答案,判断是否有离岛的距离不小于d的点,我们通过半平面求交来判断是否存在满足题意的点,“收缩”多边形可以通过直线的法向量*d来移动,方向向量不变。#include #include #include #include #include #include #include原创 2013-04-06 19:24:14 · 1401 阅读 · 4 评论 -
UVA 10340 All in All
大意不再赘述。思路:对s,t扫描一遍即可。注意字符串的大小大概是10万左右。#include #include #include #include #include #include using namespace std;const int MAXN = 101000;char s1[MAXN], s2[MAXN];int Cmp(char原创 2013-01-18 18:14:50 · 3852 阅读 · 1 评论 -
UVA 12167 Proving Equivalences
大意:给定一些已有的结论,然后问你最小还需多少添加结论才能证明一个命题。思路:有向图强连通缩点,然后判断出度与入度的最大值,当scnt == 1时,需特判。 - -!好久木有写强连通分量,生疏了。#include #include #include #include #include #include using namespace std;const原创 2013-01-19 11:54:16 · 780 阅读 · 0 评论 -
UVA 10391 Compound Words
大意不再赘述。思路:STL爆过去用了0.128s,一时竟然想不到字符串按长度赋值的库函数,不过写出来还是很快的,动态字典树0.056,哈希函数0.060,今天去新华书店看书回来的路上遇到三个好基友了,结果被他们拖出去玩了一晚上,本来还想瞒他们一阵呢,hia hia,尼玛,我的行踪再次暴露了, - -!~手写哈希的时候注意一点,就是first数组的大小要与所写的MAXN的相等,这个B原创 2013-01-23 00:17:03 · 2628 阅读 · 3 评论 -
UVA 11235 Frequent values
大意略。见训练指南P198#include #include #include #include #include #include #include using namespace std;const int maxn = 100010;const int maxd = 20;int n, m;int d[maxn][maxd];原创 2013-03-20 22:22:50 · 1070 阅读 · 0 评论 -
UVA 10970 Big Chocolate
大意略。#include #include #include #include #include #include #include #include #include #include using namespace std;int main(){ int n, m; while(~scanf("%d%d", &n, &m)) printf("%d\n", n*原创 2013-04-11 22:03:25 · 1098 阅读 · 0 评论