![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
uva OJ
林伏案
妖蛾子良多的范老爷
展开
-
la2678(前缀和,二分/尺取法)
/*translation: 有n个正整数组成一个序列。给定整数s,求长度最短的连续序列,使得他们的和大于等于ssolution: 前缀和,尺取法/二分 这道题可用尺取法或者二分法。 无论是尺取还是二分,都要求出前缀和。用二分法时,枚举起点,然后二分查找满足条件的 终点,同时更新维护答案即可。(根据前缀和的单调性) 如果用尺取法的话,就是最简单的原创 2017-03-11 15:09:49 · 667 阅读 · 0 评论 -
uva10304(区间dp)
点击打开链接/*translation: 给一个序列即可 S = (e1,e2,...,en),且e1<e2<..<en.要把这些序列构成一个二叉搜索树。 二叉搜索树是具有递归性质的,且若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它 的右子树不空,则右子树上所有结点的值均大于它的根结点的值。 因为在实际应用中,被访问频率越高的元素,就应该越接近根节点原创 2016-09-05 16:13:10 · 335 阅读 · 0 评论 -
poj3436
/*solution: 网络流问题,需要求出路径上的流量。先用拆点法建图,然后直接用edmondKarp算法增广。 添加超源点和超汇点,在超源点和空零件的状态间连边,容量为无穷大。完成品和超汇点之 间也要连上边,容量也是无穷大。同时在可以相互配合的机器之间也连上容量为无穷大的边。 相互配合指的是一台机器生产出来的半成品能够由另外一台机器直接加工,这样的两台机器原创 2016-08-13 15:55:17 · 273 阅读 · 0 评论 -
uva1658
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51253/*solution: 跟原来模板不同的是要求不能重复访问节点,所以要用到拆点法,将2~v-1的每个结点拆成i和i‘两个点 中间用容量为1费用为0的边连接起来。然后求1~v的流量为2的最小费用即可note: 拆点法date: 2原创 2016-04-25 23:36:40 · 369 阅读 · 0 评论 -
uva12169(同余模运算+暴搜)
/*translation: 根据公式x[i] = (a*x[i-1] + b) % 10001 可以生成一串数列。现在给出x[1],x[3],x[5]...x[2*T-1], 要求其下标(从1开始)为偶数的部分。solution: 其实跟数论没太大关系,纯暴力。date: 2016.8.24*/#include <iostream>#include <cst原创 2016-08-24 20:55:24 · 391 阅读 · 0 评论 -
uva753(一般图匹配)
/*translation: 一种设备插头对应着一个插座,但是有转换器可以将一种设备的插头转换成另外一种插头,每种转换器数量无限。 求最后最少剩下多少个设备匹配不上。 solution: 一般图的最大匹配。edmond-karp算法直接上。 note: 注意这个不能套匈牙利,因为转换器的关系,插头之间还有边存在。不能算作二分图。*/#include using names原创 2016-09-14 11:38:32 · 450 阅读 · 0 评论 -
uva11582(同余模基础)
/*solution: 同余模运算 首先要观察到其周期性,设F[i] = f[i]%n; F[i]呈现周期性的规律。 找到这个规律的周期t,就可以轻松求出F[a^b]。note: 注意对a^b%n的正确姿势是pow_mod(a%t[n], b, t[n])。 而不是pow_mod(a, b, t[n])。这个很容易写错!date: 2016.8.19*/#include原创 2016-08-19 19:51:44 · 406 阅读 · 0 评论 -
uva11054
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21418/*solution: 由于路费和距离相关,所以需要让路程越小越好,那么就可以让每人之和相邻的人交易。 不用考虑他们是要买还是要卖。假设a1要买5个,a2要卖2个,那么就让a1向a2买5个, 不用管a2有多少,不够可以打欠条,就变成-3了,这时a原创 2016-06-11 11:44:00 · 265 阅读 · 0 评论 -
uva11134
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34086/*solution: 行的摆放与列的拜访是无关的,所以可以将两个分开。这样就成了两个简单的一维数组问题。 当初做这到题目时候想过用n皇后的方法来做。但貌似有陷阱,暂时想不起来是什么陷阱了。 等想起来后在补充吧。note: 问题分解dat原创 2016-06-11 11:33:50 · 521 阅读 · 0 评论 -
uva1152
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36014/*solution: 首先枚举a和b,把所有a+b记录下来,然后枚举c和d。note: 中途相遇法(个人感觉有点类似归并,但又有稍微不一样。因为并没有合并子问题)date: 2016-5-18*/#include <iostrea原创 2016-06-11 11:04:16 · 407 阅读 · 0 评论 -
uva1605
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51167/*solution: 令大楼只有两层,一层第i行全市国家i,另外一层j列全是国家j。 这样就满足条件。note: 构造法date: 2016-5-18*/#include <iostream>#include <cstd原创 2016-06-11 10:59:24 · 600 阅读 · 0 评论 -
uva140
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19399/*solution: 在这种没有n皇后一样的可行性约束的问题时可以尝试“递归枚举”+“剪枝”note: 剪枝date: 2016/5/7*/#include <iostream>#include <cstdio>#includ原创 2016-05-07 20:37:37 · 730 阅读 · 0 评论 -
uva129
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19665/*solution: 直接使用dfs搜索穷举note: 注意每当dfs一层时要判断是否为困难串时,只需判断当前串的字符串即可,原理和8皇后一样。 因为前面都已经在上面几层的dfs时判断完了。date: 2016/5/7*/原创 2016-05-07 20:20:57 · 896 阅读 · 0 评论 -
uva524
#include <iostream>#include <cstring>using namespace std;int n, vis[3][1000], cnt = 0;int place(int cur) { //尝试在当前行放置一个数 if(cur == n) cnt++; //表明已经产生了一种解法 else { for(int i = 0;原创 2016-05-07 20:06:36 · 333 阅读 · 0 评论 -
uva658
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22169/* 1:用一个n位二进制串来表示当前软件的状态,每次打完补丁后, 该状态就发生改变。所以可以把该状态看成结点,补丁打上后 发生状态变化的过程看成边,就可转化成最短路问题。 2:注意需要得到从任意结点u出发的所有边时,不是读G[u原创 2016-04-21 12:32:13 · 968 阅读 · 0 评论 -
uva12661
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47070/* 算法思想: 本题就是最短路径问题,但是在边的权值上做了文章,并不单单只是考虑权值 而且还要考虑到达一条边的“阀门”时,是否要在门前进行等待,此时权值要加上 等待的时间。*/#include <iostream>#inc原创 2016-04-21 12:13:37 · 670 阅读 · 0 评论 -
dijkstra算法模板
/* dijkstra的算法模板,方便阅读使用,将方法封装在结构体中*/#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int maxn = 100 + 5;const int INF = 99999999;struct Edge {原创 2016-04-21 11:39:27 · 544 阅读 · 0 评论 -
uva10288(数学期望)
/*translation: 每张彩票上面都有一种图案,共有n种,问在平均情况下最少需要买多少张彩票才能集齐n种。solution: 期望 假设已经集齐了k张图案,所以要找到一张新的图案平均需要购买n/(n-k)张彩票。所以总次数为 sum{n/(n-i)}其中i取值范围[1, n]。note:date: 2016.10.8*/#include #include us原创 2016-10-08 21:30:08 · 617 阅读 · 0 评论 -
uva1639(数学期望,利用对数减少浮点类型数据的精度损失方法)
/*translation: 两个盒子各有n个糖果,每天随机选一个盒子(概率为p,1-p)并且吃掉里面的一颗糖果。 知道有一天打开盒子时发现是空的,求此时另外一个盒子里面糖果的个数的数学期望?solution: 数学期望,利用对数减少浮点类型数据的精度损失方法。 假设另外第二个个盒子里面剩下了i颗,则概率为C(2n-i,n)*p^n*(1-p)^(n-i) 同理,如果是地一个盒子里原创 2016-10-08 21:31:40 · 413 阅读 · 0 评论 -
uva12230(数学期望)
/*translation: 村庄A,B之间有若干条河流,每条河流上的船速各自保持不变。告诉河流条数,两个村庄之间的距离 以及每条河流的距离A村庄的位置,宽度,船的速度。求A到B的时间的期望。solution: 因为开始时船的位置随机,所以期望过河时间为2L/v。加上在路上行走的时间就是答案。note:date: 2016.10.8*/#include #include原创 2016-10-08 21:39:13 · 432 阅读 · 0 评论 -
uva11464(递推关系)
/*translation: 给出一个矩阵,每个数字要么0要么是1。可以将若干个0变换成1,问最少需要多少个这样的变换才能使得矩阵变成 偶数矩阵。一个偶数矩阵里面每一个数字的上下左右数字加起来的和都是偶数。solution: 递推 关键是找到递推关系。因为一行最多只要15个数字,所以可以暴力枚举出第一行的状态。然后根据第一行的状态其实就可以确定下一行 的状态了。进而就可以推出整个矩阵原创 2017-03-10 22:29:31 · 366 阅读 · 0 评论 -
la3602(贪心)
/*translation: 给出若干条由A,G,C,T组成的字符串。现在求一个字符串,使得它到每个给出的字符串的hamming距离最小 haming距离定义为两个字符串不同字符的个数。solution: 贪心 很明显,对于要求字符串的i位置上的字符来说,该字符必定在其它字符串上出现的字符最多。明白这一点也就没有难度了。*/#include #include #include原创 2017-03-10 21:21:04 · 231 阅读 · 0 评论 -
uva1631(DP记忆化搜索)
/*translation: 有一串密码锁,每次能够让相邻的1~3位数字向上或者向下旋转一格。给出目标状态和起始状态,问最少需要旋转几次?solution: 记忆化搜索dp 令dp(int pos, int a, int b, int c)其中pos是当前的位置,a,b,c分别是pos,pos+1,pos+2上的数字。此时 pos前面的位置都已经旋转完毕,不需要再次旋转了。那么就可以求原创 2017-01-16 15:43:50 · 947 阅读 · 0 评论 -
uva242(转换成完全背包dp)
/*translation: 一个信封最多能够贴s张邮票,现在有n个邮票的集合,求能够连续覆盖最大的值的邮票的集合。并打印出能够 i连续覆盖的最大的值。solution: 完全背包dp的可行性解法 设dp[i][j]:=前i种物品能够达到j值的所用最少的张数。然后即可按照完全背包的滚动数组dp来求解。 之后从1开始遍历,一旦遇到所需张数大于s的话,那么所能够连续覆盖的最大的值就是此时原创 2017-01-15 21:01:25 · 692 阅读 · 0 评论 -
uva1630(dp记忆化搜索)
/*translation: 将一串字符串折叠成一串尽量短的字符串solution: 记忆化搜索dp 可以看出一串字符串有3种情况: 1.字符串本身就已经是最简短 2.可以折叠成某一个更短的字符串 3.只有一部分能够折叠成更短的字符串,这时需要分成两部分来求解,需要遍历来确定拆分的位置 根据以上3种情况即可编码note: * 字符串折叠类型的题可以考虑区间dp和记忆化搜索原创 2017-01-14 21:32:56 · 793 阅读 · 0 评论 -
uva580(递推关系)
/*translation: 有n个连续摆放的盒子,分别标记U,L。现在要求至少要有三个U摆在一起,有多少种摆法?solution: 设最左边开始的连续3个U盒子位置为i,i+1,i+2(3个连续后可能还有接着相邻的U盒子)。则左边肯定没有连续3个 的盒子的情况,为了防止前面盒子与i,i+1形成连续的3个盒子,强制让i-1为L。设f[i]为最终的答案,g[i]为i个盒子摆在一起没有原创 2016-10-06 17:31:40 · 445 阅读 · 0 评论 -
uva12034(递推关系)
/*translation: 求n个人赛马最终名次的可能性个数除以10056的余数solution: 递推 假设第一名有i人,既有c[n][i]种可能,接下来有f(n-i)种 故答案sum(c[n][i]*f[n-i])%10056note: 1:求组合数c[n][m]的递推方法 2:求类似递推的题目时候,考虑分类一般是以考虑“最左”为根据来分类date: 2016.10原创 2016-10-06 17:29:36 · 358 阅读 · 0 评论 -
uva1638(递推关系,dp)
/*translation: 高为1...n的杆子排成一列,从左能看到l根,从右能够看到r根。求有多少排列的可能?solution: dp,递推 为了状态的转移无后效性,按照杆子的长短从小到大来排列,先排列最短的杆子。因为这样无论这个杆子放在哪里 都对后面的转态是如何转移的无任何影响。若是最短的杆子放在最右边,则接下来的状态成了dp[n-1][l][r-1] 同理,放在最左边则是d原创 2016-10-06 17:27:11 · 313 阅读 · 0 评论 -
uva820(最大流)
#include #include #include #include #include using namespace std;const int maxn = 10000 + 5;const int INF = 1e8;struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f):from(原创 2016-09-29 22:16:06 · 452 阅读 · 0 评论 -
uva1637(记忆化搜索,离散概率)
/*translation: lrj p327solution: 动规,记忆化搜索,全概率公式 用map, double>记录下当前的状态。然后按照记忆化搜索的dp即可note: 1:这种状态复杂的记忆化搜索不好写,怎样表示状态很关键,同时这道题一开始用double类型的d数组来记忆 导致输出nan。 2:这道题的记忆化搜索写法的状态表示值得借鉴,特别是记忆数组和状态表示。原创 2016-09-29 21:43:38 · 290 阅读 · 0 评论 -
uva11181(概率)
/*translation: 已知有n个人,其中有r个人买东西。已知每个人买东西的概率为p[i],求实际每个人 买东西的概率?solution: 概率 设Ei为事件:第i个人买东西,E:有r人买东西。则答案就是求p(Ei|E). 如此以来,用dfs枚举每个人买或者不买。即可求出来p(E)和p(Ei*E)note:date: 2016.9.28*/#include #in原创 2016-09-28 21:36:29 · 312 阅读 · 0 评论 -
uva1636(离散概率)
/*translation: 给出一串字符串(只包含01),第一个选择的位置是0,之后有两种选择,一种是跳到一个随机的位置, 另外一种是跳转到下一个位置。希望下一个位置是0的话,应该是跳到一个随机的位置(输出ROTATE) 还是跳到下一个位置(SHOOT)。solution: 离散概率。 直接利用概率公式即可解决。note:date: 2016.9.28*/#includ原创 2016-09-28 17:38:14 · 268 阅读 · 0 评论 -
uva1262(排列计数的编码解码)
/*translation: 给出两个6行5列的矩阵,根据这两个矩阵可以推出来一个5位密码串,没一位上的字母在两个矩阵中相应的列中必须出现 求按字典序的第k个密码串是什么?solution: 排列计数的编码解码 如1,2,3,4的全排列,共有4!种,求第10个的排列是(从1计 起)? 先试首位是1,后234有3!=6种<10,说明首位1偏小,问题转换成 求2开头的第(10-6=4)原创 2016-09-27 23:39:52 · 251 阅读 · 0 评论 -
uva10820(欧拉函数,排列组合)
/*translation: 给定一个数n,任意两个元素组成的二元组(x,y).其中xy均小于n。任意两个二元组之间定不存在 (k*xi, k*yi) = (xj, yj);问这样的二元组有多少个。solution: 排列组合,欧拉函数 满足条件的二元组的两个元素之间肯定互素,如果两个元素不互素,肯定存在一个整数k使得有二元组 (x/k, y/k)。与题意相反。所以利用欧拉函数很容原创 2016-09-26 16:47:25 · 465 阅读 · 0 评论 -
uva1635(唯一分解定理,杨辉三角二项式递推公式)
/*translation: 题意见lrj,p320solution: 唯一分解定理,杨辉三角迭代公式 根据杨辉三角的迭代公式即可很容易得出最后一项的每一项系数。根据是否能够整除m,就可以得出这一项是否跟 最后的结果有关。但是问题在于最后一项的数据范围太大,必须用高精度才能保存。所以直接对m取余来求解是行 不通的。所以就必须用唯一分解定理:对m进行素因子分解,然后对于每一项m的素因原创 2016-09-26 12:23:27 · 1252 阅读 · 1 评论 -
uva1640(数位统计)
/*translation: 给出整数a,b。统计a和b之间的整数中,数字0,1,2,3...9出现的个数各是多少?并打印出来。solution: 1:由于数据范围太大,直接一次统计过去肯定超时,所以解决方法是按照每1000个数划分成一个区间,依次对每个区间进行统计 累加。这样以来就能将10^8的数据量变成10^6的数据量,1s内绰绰有余。 2:定义千位及以上的为高位数,以下的为低位数原创 2016-10-09 11:26:18 · 527 阅读 · 0 评论 -
poj3159
During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the kids of flymouse’s class a large bag of candies and had flymouse distribute them. All the原创 2016-04-21 11:57:33 · 512 阅读 · 0 评论 -
uva1601(双向BFS经典题)
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51163 首先用单向BFS解决,代码如下。最后在单向基础上改进成双向单向:/*solution: 还是隐式图搜索问题,类似dijkstra,用bfs解决,这个是单向搜索,弊端是有时候随着搜索 的深入,可扩展的结点会越来越多,造成效率变慢,用双向bfs原创 2016-05-15 23:13:35 · 5372 阅读 · 5 评论 -
uva10129
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19492/*1:通常想法是将每个单词看成一个节点,但如果单词的尾部与另外一个单词的首部相同,就能架起一座“桥”,但这样以来,数组就开太大了 2:将每个单词的首尾两个字母看成节点,此时单词就是一座桥。这样就可以根据欧拉道路的出入度来判断 3:注意题中判断欧原创 2016-04-10 10:04:01 · 1089 阅读 · 2 评论 -
基本算法DFS以及BFS
图的深搜#include <iostream>#include <vector>#include <cstdio>#include <cstring>using namespace std;const int maxn = 100;int G[maxn][maxn], vis[maxn];int n, m;vector<int> ans;void dfs(int start) {原创 2016-04-09 19:53:38 · 1344 阅读 · 0 评论