![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UVa OJ
GaoJieVery6
这个作者很懒,什么都没留下…
展开
-
UVa 11212 编辑书籍 Editing a Book 迭代加深
主要思路来自于紫书,利用迭代加深的算法,一层一层往下搜,注意迭代加深的主体是bfs。所以每次的最大搜索层数maxd,都代表着0到maxd-1层都没有找到答案,所以,迭代加深相当于在maxd-1层的基础上又搜了一层(maxd层),这是典型的bfs,用来求最短路等问题(本题中求的是最少的剪切/粘贴次数)。本题中,n的范围是1到9,所以搜索层数的范围就是1到8。估价函数h()是这样确定的:每次剪切/粘贴...原创 2018-02-28 20:18:21 · 209 阅读 · 0 评论 -
uva 658 这不是bug,而是特性 二进制转化,(隐式图搜索,最短路,spfa)
主要的难点是把状态转化为二进制表示,下面是二进制的一些用法:①判定某些位置是否为1,如判定2、4位置为1,则转化为判断x|0101是否等于x。②判定某些位置是否为0,如判定2、4位置为0,则转化为判断x&1010是否等于x。③将某些位置转化为1,如2、4位置转化为1,则令x=x|0101。④将某些位置转化为0,如2、4位置转化为0,则令x=x&1010。bef[...原创 2018-07-19 18:37:29 · 182 阅读 · 0 评论 -
uva 753 A Plug for UNIX 增广路求最大流
用map<string, int>为每一个插座,插头,设备指定一个编号u,先把源点与所有设备,设备与对应的插头,插座与汇点连起来,这些弧的容量为1,然后把转化器加进来,转化器相连的两个东西间加弧,容量为inf,然后用ek模板求最大流。我的源点设为了0,汇点设为了500,(汇点要设大一些,否则可能会与插座插头等的编号重复),inf为0x3f3f3f3f。#include <...原创 2018-07-20 16:30:01 · 129 阅读 · 0 评论 -
uva 1658 Admiral 海军上将 (最小费用最大流+拆点)
因为题目中限制了点只能用一次,所以我们利用拆点法来保证每个点只能用一次(最小费用最大流的算法会保证每条边用一次)下面我们来看一下拆点法是怎么工作的,这是建图的代码for(int i = 2; i < n; i++) ans.AddEdge(i, i+n, 1, 0);ans.AddEdge(1, 1+n, 2, 0);ans.AddEdge(n, n+n, 2, 0...原创 2018-07-20 22:28:45 · 226 阅读 · 0 评论 -
uva 673 栈
#include <iostream>#include <cstring>#include <stack>#include <cstdio>using namespace std;int main(){ //freopen("ztest.txt","r",stdin); //freopen("zans.txt","原创 2018-07-15 16:41:57 · 138 阅读 · 0 评论 -
uva 712 二叉树
好好读题,尤其是input,关于xi会有一个对应关系,Eg:第一行输入x3, x2, x1, 然后输入100,那么实际要操作的指令是001#include <cstdio>#include <cstring>#include <iostream>#include <string>using namespace std;int main()...原创 2018-07-15 17:59:52 · 169 阅读 · 0 评论 -
uva 439 bfs 广搜
#include <cstdio>#include <iostream>#include <string>#include <algorithm>#include <cctype>#include <queue>#include <cstring>using namespace std;int v原创 2018-07-15 18:43:07 · 119 阅读 · 0 评论 -
uva 821 Page Hopping (Floyd)
裸的Floyd,或许。。。应该注意一下怎么算平均值?#include <cstdio>#include <iostream>#include <string>#include <map>#define inf 0x3f3f3f3fusing namespace std;int dis[1000][1000];int main(...原创 2018-07-20 23:18:57 · 168 阅读 · 0 评论 -
uva 1001 Say Cheese 最短路 spfa Floyd
首先是建图,把下标为0和下标为n+1的两个点设为起点和终点,把这两个点看成两个半径为0的洞,下标1~n的点为洞,则图上两点的距离为dis = |(xi,yi,zi)-(xj,yj,zj)|-ri-rj;如果dis<0,则边权为0,如果dis>0,则边权为10*dis。有两种算法,一种是spfa+隐式图搜索,ac用时0.000,一种是直接Floyd,ac用时0.010。spfa+...原创 2018-07-21 10:51:49 · 150 阅读 · 0 评论 -
uva 11992 Fast Matrix Operations (线段树区间修改,模板题)
e[i]给出第i个点对应的区间范围s[k][i]给出矩阵第k行的线段树第i个点对应的区间的和x[k][i]维护最小值d[k][i]维护最大值#include <cstdio>#include <algorithm>#include <cstring>#define inf 0x3f3f3f3fusing namespace std;...原创 2018-08-20 20:02:37 · 164 阅读 · 0 评论 -
uva LA 3026 Period (KMP算法)
#include <iostream>#include <string>#include <cstdio>#include <cstring>using namespace std;int f[1000005];int main(){ //freopen("ztest.txt","r",stdin); int n; int f...原创 2018-08-20 22:18:52 · 204 阅读 · 0 评论 -
uva 11922 Permutation Transformer (splay树的分割及合并)
这是按ljr的splay写的#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <string>using na原创 2018-08-24 18:31:32 · 178 阅读 · 0 评论 -
uva 10870 Recurrences (快速矩阵幂 + 递推)
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#define LL long long using namespace std;int n, d, mod;int f[20], a[20]...原创 2018-09-04 17:32:09 · 134 阅读 · 0 评论 -
uva 10808 Rational Resistors(基尔霍夫定律+高斯消元+并查集+分数)
好题啊,这个题告诉我们电路分析还是有用的!!利用基尔霍夫定律,写出节点电压法的方程,然后用高斯消元解方程。节点电压法点这里。由于两个待查询结点之间不一定是通路,所以可以利用并查集先判断一下两个点是否在一个联通分量里,如果不在,就直接输出1/0关于列方程的一些说明,代码中会有注释。 #include <iostream>#include <cstdio>...原创 2018-09-05 18:15:08 · 216 阅读 · 0 评论 -
uva 1660 Cable TV Network (最小割最大流)
#include <cstdio>#include <cstdlib>#include <vector>#include <iostream>#include <string>#include <queue> #include <cstring>#include <algorithm&原创 2018-09-10 17:31:41 · 226 阅读 · 0 评论 -
uva 10048 噪音恐惧症 Audiophobia Floyd算法
ljr的书里说错了,套Floyd算法的模板是,加改为max, min还是min。还有就是ljr的if(d[i][j] < INF && d[k][j] < INF)明显是错的,应该写成if(d[i][k] < INF && d[k][j] < INF)#include <iostream>#include <cs...原创 2018-07-19 11:28:54 · 239 阅读 · 0 评论 -
uva 1572 拓扑排序
主要利用了拓扑排序的算法,connect函数的作用是如果正方块的两条边都不为00,且设一条边为Char1+,一条边为Char2-,则Char1+可通过这个正方块和Char2+相连,即有向图上的两点Char1+和Char2+之间有边,然后拓扑排序,如果图内有环,就说明可以组成无限大的结构。#include <iostream>#include <cstring>#i...原创 2018-07-12 20:56:36 · 533 阅读 · 0 评论 -
uva 1151 买还是建 buy or build 最小生成树 Kruskal
#include <cstdio>#include <algorithm>#include <cstdlib>#include <iostream>#include <vector> #define LL long longusing namespace std;typedef struct edge{ int s;...原创 2018-07-18 21:02:14 · 223 阅读 · 0 评论 -
UVa 1411 Ants 巨人和鬼 分治算法
思路主要是按照紫书上来的,分治算法。先对所有点的y坐标排序,找出y坐标最小的点,设此点为S0。然后计算其他点与此点的连线与x正半轴的夹角,再按夹角的大小给这些点排序,此时,所有点的夹角都在0度到180度之间,所以适合用cos来表示角的大小。S0为蚂蚁时(S0为苹果时同理),则设sumants = 1, sumapple = 0,从夹角最小的点开始(设为S1)(夹角最大的点设为S3),遇到蚂蚁就su...原创 2018-02-26 23:52:16 · 580 阅读 · 0 评论 -
UVa 1218 树形DP
思路主要是紫书 上的,我在这里说一下建树的细节。#include <vector>#include <cstdio>#include <algorithm>#include <cstring>#include <set>using namespace std;vector<int> son[100...原创 2018-02-25 19:03:39 · 151 阅读 · 0 评论 -
uva 247 电话圈 (Floyd求传递闭包)
利用好map,set等工具实现人与编号的双射,然后就是裸的Floyd。 #include <cstdio>#include <map>#include <set>#include <queue>#include <algorithm>#include <iostream>#include &l...原创 2018-03-15 16:32:32 · 180 阅读 · 0 评论 -
UVa 1625 动态规划
需要注意c[i][j]的递推算法和sp,sq,ep,eq的赋初值。由于dp[i][j]表示第一个字符串取i个,第二个字符串取j个,所以不论dp[i][j]从dp[i-1][j]+c[i-1][j]来的还是从dp[i][j-1]+c[i][j-1]来的,都可以在保证i != 0的情况下用c[i][j] = c[i-1][j] +/- 1 或0来算。#include<iostream> ...原创 2018-07-08 14:26:16 · 201 阅读 · 0 评论 -
uva 1627 动态规划,01背包,二分图染色
主要思路是大白书上的,利用二分图染色判断是不是no solution,二分图染色的那个函数就是judge和dfs,然后dp[i][j]==1表示把第i个二分图的一部分加入第一队后,第一队有j人,dp[i][j] == 0 表示把第i个联通块加入第一队后,第一队的人数不可能是j人,显然,设有m个联通块,n个人,那么如果有最优解,最优解就是dp[m][j]中j最接近n/2的。way[][]数组用来保存...原创 2018-07-09 13:34:54 · 172 阅读 · 0 评论 -
uva 1600 bfs 多加一个状态
node.state代表此时已经走了几个障碍,node.step代表到达此状态需要走几步#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <queue>#include <iostream>#def...原创 2018-07-16 20:17:10 · 148 阅读 · 0 评论 -
uva 12166 递归建树
想了好久没想出来,看了大佬的代码恍然大悟,这递归写的惊为天人~我只解释一点,当确定一个节点为基准时,设此节点深度为depth,权重为weight,如果这棵树平衡,那么树的总权值为weight<<depth,这是因为树是二叉树,一个节点为weight,若要平衡,则它的兄弟节点也为weight,因此它的父亲节点为2*weight,同理,此节点的叔父节点也为2*weight,此节点的祖父...原创 2018-07-16 22:13:46 · 209 阅读 · 0 评论 -
uva 1336 修长城 动态规划
dynamic(i, j, k)中i代表已修好的部分的左端点,j代表已修好的部分的右端点, k==0代表此时机器人在i点, k==1代表此时机器人在j点。如果k = 0, 那么机器人一定是修好i+1到j的所有点,再到i点修好了i点处的缺口,所以k=0时的转移方程为dynamic(i, j, 0) = min(dynamic(i+1, j, 0) + 代价, dynamic(i+1, j, 1) +...原创 2018-07-10 19:27:27 · 248 阅读 · 0 评论 -
uva 120 stacks of flapjacks
小水题一个~#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;原创 2018-07-10 20:59:51 · 93 阅读 · 0 评论 -
uva 804 Petri Net Simulation 模拟
理解题意后,没有太大难度,直接模拟就好了,没有坑。#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <vector>#include <map>u原创 2018-07-17 15:10:11 · 271 阅读 · 0 评论 -
uva 1471 defense lines
如果用O(n^2)是会TLE的,所以只能用O(nlogn)来做。r[i]是以第i个元素为开头的最长连续递增子序列,l[i]是以第i个元素为结尾的最长连续递增子序列。Min[i]是长度为i的最长连续递增子序列的最后一个元素的最小值。Eg:若序列为6 5 4 3 2 1则Min[1]为1。ans = max(ans, r[i] + len - 1 );为什么要减一,读者自己试一试就知道了。for(in...原创 2018-07-11 18:43:44 · 160 阅读 · 0 评论 -
uva 10954 Huffman编码
此题水的惊天地,泣鬼神。。。。#include <cstdio>#include <cstdlib>#include <iostream>#include <queue>using namespace std;int main(){ int n; while(scanf("%d", &n) && n) {..原创 2018-07-11 21:05:39 · 127 阅读 · 0 评论 -
uva 11093 模拟
水题解释一下ljr的“想一想,为什么”#include <iostream>#include <cstdio>#include <cstring>#include <string>#define LL long long intusing namespace std;int a[100000];int dis[100000];int...原创 2018-07-11 22:25:48 · 124 阅读 · 0 评论 -
uva 1395 苗条的树 slim tree 最小生成树 Kruskal
暴力枚举,时间复杂度为O(n^2)#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#define INF 0x3f3f3f3fusing namespace std;typedef struct node{ int s; int...原创 2018-07-18 17:07:59 · 201 阅读 · 0 评论 -
UVa11582 巨大的斐波那契数列
由于模数为n,又因为F[i] = (F[i-1] + F[i-2]) % n,所以F[i]只有n*n种可能(F[i-1]有n种可能,F[i-2]有n种可能),所以循环节长度比小于n*n,因此我们只要算出循环节,再用快速幂解出k = a^b%L(L为循环节长度),输出F[k]即可。#include <iostream>#include <cstring>#inclu...原创 2018-09-27 17:38:04 · 381 阅读 · 0 评论