
-UVa
文章平均质量分 84
virgoDd
Good afternoon,good evening and good night
展开
-
UVa 1587 Box
大水题一发 弄清长方体的几个面的关系就行了#include#includeusing namespace std;const int N = 6;struct rec{ int l, w;} r[N];bool cmp(rec a, rec b){ return a.w < b.w || (a.w == b.w && a.l < b.l);}int main()原创 2015-01-17 21:55:17 · 3160 阅读 · 0 评论 -
UVa 202 Repeating Decimals(模拟)
大水题 模拟在草稿纸上算除法的过程→_→#include#includeusing namespace std;const int N = 3005;int a[N], v[N];int main(){ int n, m, cnt; while(~scanf("%d%d", &n, &m)) { cnt = 0; mems原创 2015-01-18 10:17:16 · 1144 阅读 · 0 评论 -
UVa 1025 A Spy in the Metro(DP)
题意 某城市的地铁有n个车站 编号1到n 有m1辆车向右开 给出m1个从车站1出发的时间 m2辆车向左开 给出m2个从车站n出发的时间 t[i]为火车从第i个车站开到第i+1(或相反)个车站需要的时间 Maria在车站1 她需要恰在时刻T到达第n个车站 求她的最小总车站等待时间基础的多阶段决策DP 令d[i][j]表示时刻j在i号车站剩下的最小总等待时间 每种状态有3种选择原创 2015-02-06 16:08:26 · 1948 阅读 · 0 评论 -
UVa 714 Copying Books(贪心 二分)
题意 把m数分成k组 使每组数的和的最大值最小 如果有多种分法 靠前的组的和尽量小关键是找出那个最小的最大值 可以通过二分来找出 开始左端点为m个数中最大的数 右端点为m个数的和 若中点能将m个数分为小于等于k组 比它大的肯定都是可以的 中点变为右端点 否则中点变成左端点然后就可以贪心逆向模拟了 从后往前每组选择尽量多的数直到剩下的数等于组数 #include原创 2015-02-03 19:10:03 · 1218 阅读 · 0 评论 -
UVa 11134 Fabled Rooks(贪心)
题意 在n*n的棋盘上的n个指定区间上各放1个'车’ 使他们相互不攻击 输出一种可能的方法行和列可以分开看 就变成了n个区间上选n个点的贪心问题 看行列是否都有解就行 基础的贪心问题 对每个点k选择包含它的最优未使用区间 由于在给k找最优区间时1~k-1的最优区间都已经找好了 所有右界最小的区间肯定是最优区间原创 2015-02-02 17:19:47 · 1775 阅读 · 0 评论 -
UVa 11054 Wine trading in Gergovia(扫描)
题意 有n个村庄 第i个村庄需要买a[i]的酒 a[i]为负时该村庄可卖掉-a[i]的酒 保证所有a[i]的和为0 一个单位的酒从一个村庄运输到相邻村庄的消耗为1 求运输完所有酒需要的最小消耗总消耗最少时 每个需要买的村庄都会找离他最近的可以卖的村庄 容易发现 这种状况下 从第一个村和第二个村庄之间的运输量为abs(a[1]) 第二个村庄和第三个村庄之间的运输量为ab原创 2015-02-03 10:01:33 · 938 阅读 · 0 评论 -
UVa 1152 4Values whose Sum is 0
题意 从4个n元集中各挑出一个数 使它们的和为零有多少种方法直接n^4枚举肯定会超时的 可以把两个集合的元素和放在数组里 然后排序 枚举另外两个集合中两元素和 看数组中是否有其相反数就行了 复杂度为n^2*logn#include #define l(i) lower_bound(s,s+m,i)#define u(i) upper_bound(s,s+m,i)using原创 2015-01-29 10:49:22 · 978 阅读 · 0 评论 -
UVa 140 Bandwidth(DFS 回溯 剪枝)
题意 有一个无向图 对于其所有顶点的一个排列 称一顶点与所有与其有边的其它顶点在排列中下标差的最大值为这个顶点的带宽 而所有顶点带宽的最大值为这个排列的带宽 求这个图带宽最小的排列枚举排列 ans记录当前找到的最小带宽 枚举过程中一旦出现带宽大于ans的也就不用再扩展了 这样枚举完就得到了答案#include#includeusing namespace std;c原创 2014-11-26 18:48:16 · 1085 阅读 · 0 评论 -
UVa 524 Prime Ring Problem(DFS , 回溯)
题意 把1到n这n个数以1为首位围成一圈 输出所有满足任意相邻两数之和均为素数的所有排列直接枚举排列看是否符合肯定会超时的 n最大为16 利用回溯法 边生成边判断 就要快很多了#includeusing namespace std;const int N = 50;int p[N], vis[N], a[N], n;int isPrime(int k){ fo原创 2014-11-20 16:42:21 · 1044 阅读 · 0 评论 -
UVa 10954 Add All(优先队列)
题意 求把所有数加起来的最小代价 a+b的代价为(a+b) 越先运算的数 要被加的次数越多 所以每次相加的两个数都应该是剩下序列中最小的数 然后结果要放到序列中 也就是优先队列了#include#includeusing namespace std;priority_queue, greater >q;typedef long long ll;ll ans;int原创 2014-11-17 15:14:08 · 909 阅读 · 0 评论 -
UVa 297 Quadtrees(四分树)
题意 可以用一个四分图表示一32*32的黑白图像 求两个四分树对应图像相加所得图形黑色部分有多少像素直接用一个32*32的矩阵表示图 黑色为非0白色为0 递归建图 最后有多少个非零就是答案了#include#includeusing namespace std;const int L = 32, N = 1050;char s[N];int ans[L][L], c原创 2014-10-09 18:32:56 · 1390 阅读 · 0 评论 -
UVa 572 Oil Deposits(DFS求8连通块)
题意 求n*m矩阵中'@'连通块的个数 两个‘@’在一个九宫格内就属于一个连通块最基础的DFS 遇到@就递归扫描周围8个并标记当前格子已访问 然后就得到答案了#includeusing namespace std;const int N = 110;char mat[N][N];int dfs(int r, int c){ if(mat[r][c] != '@'原创 2014-10-10 14:38:24 · 1144 阅读 · 0 评论 -
UVa 442 Matrix Chain Multiplication(矩阵链乘,模拟栈)
题意 计算给定矩阵链乘表达式需要计算的次数 当前一个矩阵的列数等于后一个矩阵的行数时 他们才可以相乘 不合法输出error输入是严格合法的 即使只有两个相乘也会用括号括起来 而且括号里最多有两个 那么就很简单了 遇到字母直接入栈 遇到反括号计算后入栈 然后就得到结果了#include#include#includeusing namespace std;const原创 2014-09-17 09:32:50 · 1445 阅读 · 0 评论 -
UVa 11988 Broken Keyboard(模拟链表)
题意 有一个键盘坏了 会在你不知道的情况下按下home或者end 给你这个键盘的实际输入 要求输出显示器上的实际显示输入最大5MB 所以直接数组检索肯定会超时的 用数组模拟链表 就可以很快了#include#includeusing namespace std;const int N=100005;char s[N];int next[N];int main()原创 2014-09-17 11:14:59 · 1097 阅读 · 0 评论 -
UVa 514 Rails(模拟栈)
题意 n辆火车按顺序依次进站 判断给定的出战顺序是否可能用数组模拟模拟栈代表车站 车依次进站 每当栈顶火车序号与当前要出站的b[cur] 相等时 就让栈顶元素出栈 即top-- #include#includeusing namespace std;const int N = 2000;int b[N], c[N];int main(){ int l, cur原创 2014-09-16 15:20:58 · 1463 阅读 · 0 评论 -
UVa 699 The Falling Leaves(递归建树)
题意 假设一棵二叉树也会落叶 而且叶子只会垂直下落 每个节点保存的值为那个节点上的叶子数 求所有叶子全部下落后 地面从左到右每堆有多少片叶子和上一题有点像 都是递归输入的 一个节点(设水平位置为p) 则它的左右儿子节点的水平位置分别为 p-1 p+1 也是可以边输入边处理的 输入完也就得到答案了 注意每个样例后面都有一个空行 包括最后一个#includ原创 2014-09-24 12:48:14 · 1596 阅读 · 0 评论 -
UVa 839 Not so Mobile(树的递归输入)
题意 判断一个树状天平是否平衡 每个测试样例每行4个数 wl,dl,wr,dr 当wl*dl=wr*dr时 视为这个天平平衡 当wl或wr等于0是 下一行将是一个子天平 如果子天平平衡 wl为子天平的wl+wr 否则整个天平不平衡容易看出 输入是递归的 所以我们可以直接递归 边输入边判断#includeusing namespace std;bool so原创 2014-09-24 09:17:07 · 1590 阅读 · 0 评论 -
UVa 548 Tree(建树,递归遍历)
题意 给你一个树的中序遍历和后序遍历 某个节点的权值为从根节点到该节点所经过节点的和 求权值最小的叶节点的值 如果存在多个 输出值最小的那个把树建好就好说了 递归递归dfs msun保存最小叶节点权值 ans保存答案原创 2014-09-23 20:22:28 · 1388 阅读 · 0 评论 -
UVa 116 Unidirectional TSP(DP)
题意 一个n*m的环形矩阵(第一行和最后一行是相邻的) 从第一列任意位置出发 只能往右上,右,右下3个方向走 求走到第m列经过的的最小数字和基础DP 横着的数塔问题#include #define l(x) d[x][j+1]using namespace std;const int N = 105;int n, m, g[N][N], d[N][N], fol[N][N原创 2015-02-06 22:03:36 · 945 阅读 · 0 评论 -
UVa 1589 Xiangqi(模拟 HDU4121)
题意 给你一个黑方被将军的象棋残局 判断红方是否已经把黑方将死模拟题 注意细节就行了 看黑方的将是否四个方向都不能走#include#includeusing namespace std;const int N = 12;char brd[N][N];int dx[] = { -1, 1, 0, 0}, dy[] = {0, 0, -1, 1};int hx[] =原创 2015-01-20 14:07:37 · 2661 阅读 · 6 评论 -
UVa 136 Ugly Numbers(优先队列)
题意 质因数只可能有2,3,5的数称为丑数 输出第1500个丑数STL优队列应用 1是丑数 丑数的2,3,5倍都是丑数 用优先队列模拟就行了#include #include #include #include using namespace std;typedef long long ll;//priority_queue, greater > q;struct原创 2015-01-20 20:52:48 · 1376 阅读 · 0 评论 -
UVa 1595 Symmetry(暴力)
题意 给你不超过1000个点的坐标 判断这些点是否是关于一条竖线对称的没想到暴力枚举可以过 如果存在对称轴的话那么对称轴的横坐标一定是最左边的点和最右边的点的中点 为了避免中点是小数 可以将横坐标都乘上2 然后在判断所有点是否有对称点就行了#include using namespace std;const int N = 1005;int x[N], y[N], n原创 2015-01-22 10:04:16 · 4308 阅读 · 1 评论 -
UVa 11426 GCD - Extreme (II) (欧拉函数应用·O(N*logN))
题意 令 G(n) = sum{gcd(i, j) | 0 给你一个n 输出G(n)令 F(n) = sum{gcd(i, n) | 0 那么有递推式 G(n) = G(n-1) + F(n) , G(0) = 0 也就是说只用求出F(n) 就能递推求出 G(n)了 而求F(n)就比较容易了 对于i 设 x < i , gcd(x,i) = 1即x, n 互质原创 2015-08-09 17:52:29 · 1036 阅读 · 0 评论 -
UVa 514 Rails(栈)
Rails There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time.原创 2014-09-02 09:50:30 · 668 阅读 · 0 评论 -
UVa 11624 Fire!(BFS 逃离火灾)
题意 n*m的迷宫中有一些着火点 每个着火点上下左右相邻的非墙点下一秒也将成为一个着火点 Joe每秒能向相邻的点移动一步 给你所有着火点的位置和Joe的位置 问Joe逃离这个迷宫所需的最小时间可以先一遍bfs把每个点的最早着火时间存起来 只有Joe到达该点的时间小于这个时间Joe才能走这个点 只需要对Joe所在的点为起点再来一次bfs就行了 需要注意的是开始可能有多个着原创 2015-04-03 12:58:31 · 945 阅读 · 0 评论 -
URAL 1762 Search for a Hiding-Place(数学·模拟)
题意 你在一个n*m个白色正方形格子组成的矩形的某个顶点格子 你沿着45度角的方向走 到了边界就改变方向90度 每次经过一个格子都改变他原来的颜(白或灰) 求你走到另一个顶点格子时矩形中有多少格子是灰色的这题可以用公式也可以直接模拟 模拟就是一直向右移n-1位 每次超过边界就可以把边界向右移m-1位 用cnt记录超过边界的次数 那么每次都会经过cnt个已经走过的格子 (每个格子最原创 2015-03-11 21:32:21 · 748 阅读 · 0 评论 -
UVa 439 Knight Moves(BFS应用)
题意 求国际象棋中骑士从一个位置移东到另一个位置所需最少步数基础的BFS应用#include using namespace std;int x[] = { -2, -1, -2, -1, 1, 2, 1, 2};int y[] = { -1, -2, 1, 2, -2, -1, 2, 1};int d[15][15], sx, sy, ex, ey;pair q[105],原创 2015-01-23 18:20:47 · 854 阅读 · 0 评论 -
UVa 536 Tree Recovery(先序,中序求后序)
题意 给你二叉树的先序序列和中序序列 求它的后序序列先序序列的第一个一定是根 中序序列根左边的都属于根的左子树 右边的都属于右子树 递归建树就行了#include using namespace std;typedef struct TNode{ char data; TNode *lc, *rc;} node, *BTree;void build(B原创 2015-01-23 20:25:47 · 924 阅读 · 0 评论 -
UVa 210 Concurrency Simulator(双端队列)
题意 模拟程序并行运行 STL队列 双端队列 的应用 用双端队列维护即将执行的程序 再用个队列维护等待变量释放的程序 用lock表示变量锁定状态先将所有程序放到执行队列中 每次取出队首程序运行不超过lim时间 未运行玩又放到执行队列队尾 遇到lock时 若当前锁定状态为false就将锁定状态变为true 否则将当前程序放到等待队列队尾并结束运行 遇到unlock时原创 2015-01-23 13:16:07 · 5723 阅读 · 1 评论 -
UVa 10305 Ordering Tasks(拓扑排序)
题意 输出n个数m组小于关系的一种可能的拓扑排序应用dfs拓扑排序 访问j时 若存在i#include using namespace std;const int N = 105;int n, m, t, v[N], tpo[N], g[N][N];void dfs(int j){ if(v[j]) return; for(int i = 1; i <=原创 2015-01-23 15:28:42 · 1038 阅读 · 0 评论 -
UVa 673 Parentheses Balance(括号配对 栈)
题意 判断输入的括号序列是否是配对的栈的基础应用 栈顶元素与输入的字符匹配就出栈咯 注意括号序列可以为空STL栈#include using namespace std;int main(){ int cas; char c; cin >> cas; getchar(); while(cas--) { stac原创 2015-01-23 16:54:03 · 1129 阅读 · 0 评论 -
UVa 1593 Alignment of Code(字符串)
题意 按要求对齐代码字符串流的应用#include using namespace std;const int N = 1005, M = 200;string s[N][M], line;int cw[M], cn[N];int main(){ int r = 0, c = 0; while(getline(cin, line)) {原创 2015-01-21 12:49:29 · 2249 阅读 · 0 评论 -
UVa 12504 Updating a Dictionary(更新字典)
题意 比较两个字典 按字典序输出所有添加 删除 修改的项 如果没有任何更新 输出 No changesSTL map的应用 对比两个字典 注意开始字符串的处理和字典可以为空#includeusing namespace std;map d[2];map::iterator it;const int N = 105;string s, a, b, t[N];vo原创 2015-01-22 16:16:49 · 2162 阅读 · 0 评论 -
UVa 12110 Printer Queue(特殊队列)
题意 模拟打印队列 队列中有优先级大于队首的元素 队首元素就排到队尾 否则队首元素出队 输出开始在p位置的元素是第几个出队的直接模拟这个过程就行了#include using namespace std;const int N = 205;int q[N];int main(){ int cas, n, p, cnt, front, rear, i;原创 2015-01-22 13:15:38 · 855 阅读 · 0 评论 -
UVa 10391 Compound Words(复合词)
题意 输出所有输入单词中可以由另两个单词的组成的词STL set的应用 枚举每个单词的所有可能拆分情况 看拆开的两个单词是否都存在 都存在的就可以输出了#include using namespace std;string a, b;set s;set::iterator i;int main(){ int l; while(cin >> a) s.i原创 2015-01-21 17:49:37 · 1132 阅读 · 0 评论 -
UVa 540 Team Queue(团队队列)
题意 模拟团队队列的入队和出队STL应用 用一个队列维护团队编号 再用一个队列数组维护个体#include #include #include #include using namespace std;const int N = 1000005;int team[N];int main(){ int cas = 0, n, t, a; char cm原创 2015-01-20 20:39:29 · 988 阅读 · 0 评论 -
UVa 12563 Jin Ge Jin Qu hao(01背包)
题意 你在KTV还剩t秒钟的时间 你需要在n首歌中选择尽量多的歌使得歌的数量最多的前提下剩下的时间最小至少要留一秒给劲歌金曲 所以是一个容量为t-1的01背包 d[i][j]表示恰用j秒时间在前i首歌中最多唱多少首 每个状态有两种选择 唱或不唱第i首歌所以有转移方程d[i][j]=max(d[i-1][j],d[i-1][j-c[i]]+1)#include using原创 2015-02-07 13:54:46 · 2066 阅读 · 0 评论 -
UVa 1347 Tour(DP)
题意 二维坐标系上有n个点 从第一个点出发经过部分点到达第n个点 再从第n个点回到第一个点 除了第一个点 每个点都经过且仅经过一次 求最短路径长度还是基础的DP 想出状态转移方程就容易了 d[i][j]表示去的时候经过第i个点回来经过第j个点且1~max(i,j)间的点都已经走过 显然d[i][j]=d[j][i] 所以只用考虑i>j的部分 i 第i+1个点要么去的原创 2015-02-06 20:12:54 · 857 阅读 · 0 评论 -
UVa 340 Master-Mind Hints(猜数字游戏的提示)
题意 猜数字游戏 统计猜的数字有多少个数字位置正确 有多少个数字在答案中出现但是位置不正确 每个字符只能匹配一次直接匹配每位数#include #include #include using namespace std; const int N = 1005; int a[N], b[N], c, d; int main() {原创 2014-08-31 09:20:01 · 1297 阅读 · 0 评论 -
UVa 122 Trees on the level(建树,层次遍历)
题意 建树并层次遍历输出 (data,pos) pos表示改节点位置 L代表左儿子 R代表右儿子 建树很简单 开始在根节点 遇到L往左走遇到R往右走 节点不存在就新建 走完了就保存改节点的值 输出直接bfs就行了了 #include#include#includeusing namespace std;const int maxn = 300;char原创 2014-09-23 10:26:45 · 1202 阅读 · 0 评论