摘要:
Problem - 4063 几何加简单最短路。 题意是给出若干圆的圆心以及半径,求出从给出的起点到终点的最短路径的长度,可以移动的区域是圆覆盖到的任意一个位置。 做法是这样的,对圆两两求交点,用这些得到的交点以及起点和终点作为我们要构造的图的顶点。因为我们要的是最短路径,所以如果我们要从一个区域穿越到另一区域的时候,必然是经过这些交点的。然后我们可以对这些交点两两判断是否能够相互到达。这个判断才是这道题的关键。判断的方法可以有几种,我想到的一是先求出直线与所有圆的交点,排序以后判断所有的圆能否覆盖掉这条线段;而我的是另一种方法,就是用一个队列,将还没有被覆盖的线段存在队列里,每次跟圆相... 阅读全文
摘要:
Problem - 1277 无聊做水题的时候发现的一道题目。这道题第一反应可以用自动机来解决。当然,条件是各种限制,从而导致可以用直接映射标记的方法来搜索。具体的做法就像RK算法一样,将字符串hash成一个数,这里每一个关键字前四位都是不同的,这样就有利于hash搜索了。当前四位匹配的时候,就可以搜索整个串是否完全匹配。这整个的复杂度大概是O(n*m),n是全文测长度,m是关键字的长度。自动机代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 ... 阅读全文
摘要:
Problem - 2410 挺好玩的一道题目。这道题的意思是给出一个模糊值以及一个确定值,要求求出模糊值中大于确定值的个数有多少。 这题我是直接用dfs的方法搜索的,对于每一位如果之前位置的形成的数比确定值当前形成的数小,之后就不可能形成满足要求的值了。如果是大于的,之后的所有问号都可以填入0~9任何一个数字。如果是等于,就要继续搜索下一位。代码如下: 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 typedef long long LL; 9 char str1[15], s... 阅读全文
摘要:
Problem - 1289 好题。其实就是模拟IEEE754的格式,不过要注意的是,这里用的32位是float,用double就不对了。代码如下: 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 int main() { 8 float x; 9 while (cin >> x) {10 int cnt = 0;11 while (fabs(x) >= 2.0) x /= 2.0, cnt++;12 while (fabs(x) < 1.0)... 阅读全文
摘要:
ACM-ICPC Live Archive 三维几何,题意是要求求出两条空间线段的距离。题目难度在于要求用有理数的形式输出,这就要求写一个有理数类了。 开始的时候写出来的有理数类就各种疯狂乱套,TLE的结果是显然的。后来发现,在计算距离前都是不用用到有理数类的,所以就将开始的部分有理数改成直接用long long。其实好像可以用int来做的,不过我的方法比较残暴,中间运算过程居然爆int了。所以就只好用long long了。代码如下,附带debug以及各种强的数据: 1 #include 2 #include 3 #include 4 #include 5 #includ... 阅读全文
摘要:
3334 -- Connected Gheeves 题意是,给出两个尖形的相连的容器,要求向其中灌水。它们具有日常的物理属性,例如两个容器中水平面高度相同以及水高于容器顶部的时候就会溢出。开始的时候打算直接用几何的计算,求出精确值。后来发现,这样的计算实在是太麻烦了,实现起来有很多细节要注意。于是,后来就想到了用二分的方法,枚举水平面的高度,然后求直线切割容器得到的多边形的面积,因为这个面积会随着水平面的高度具有单调性。注意预先确定好二分的上下界即可。1y~代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 ... 阅读全文
摘要:
Problem - 1596 变形最短路问题,给出邻接矩阵,要求求出给定点对间安全率最大值。 这题可以用dijkstra+heap来做。对于每一个查询,做一次dij即可。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 const int N = 1111;10 double wt[N][N];11 bool vis[N];12 #define _clr(x) memset(x, 0, sizeof(x))13 typedef pair PDBI;... 阅读全文
摘要:
Problem - 1736 模拟,不过好多地方要注意。 对于每一行,左右双引号要重新计算,有可能有全角的双引号,也要算进去。代码如下: 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 int main() { 9 char str[2][3];10 strcpy(str[0], "“");11 strcpy(str[1], "”");12 // freopen("in", "r", stdin);13 char ch 阅读全文
摘要:
Problem - 1430 跟八数码相似的一题搜索题。做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std; 10 11 char q[44444][10], op[44444], tmp[10]; 12 int qh, qt, last[44444]; 13 map pos; 14 1... 阅读全文
摘要:
Problem - 1358 KMP求循环节次数。题意是,给出一个长度为n的字符串,要求求出循环节数大于1的所有前缀。可以直接用KMP的方法判断是否有完整的k个循环节,同时计算出当前前缀的循环节的个数。代码如下: 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 const int N = 1111111; 9 char buf[N];10 int next[N];11 12 void getNext(char *str, int len) {13 int i = 0, j =... 阅读全文