UVA
文章平均质量分 55
无敌大饺子
这个作者很懒,什么都没留下…
展开
-
UVA 11464 Even Parity
这题和ZOJ上的 Extended Lights Out 很像,只不过这题要求是每个点的相邻点的和必须是偶数.做法是枚举第一行2^15种可能组合.然后后面的每一行都可以根据前一行推出来.最后判断下最后行是否符合条件要求.#include #include #include #include #include using namespace std;const int原创 2013-05-30 15:55:10 · 502 阅读 · 0 评论 -
UVA 10318 Security Panel
搜索题.剪枝1.如果当前点的左上一个点是空,或者当前点是最右边的点并且上面一个点是空,剪掉剪枝2.如果当前需要点亮的点数量大于等于最小值的点数量,剪掉.#include #include #include using namespace std;const int maxn = 6;char pt[maxn][maxn];char map[maxn][maxn];int原创 2013-06-13 10:22:40 · 419 阅读 · 0 评论 -
UVA 1326 Jurassic Remains
题目意思就是给出一堆字符串求出一个字符串集合,满足里面的每个字符的出现次数都是偶数,并且字符串的数量最多.一看到题目首先想到的就是枚举2^24个状态,结果不用试都肯定是超时的.然后看了解题报告,刘汝佳神牛的书上用的是二进制枚举子集加二进制存储状态来做的.首先保存每个字符串的xor结果(同一个字符串里面的字符也是可以配对的).然后首先枚举前n / 2个字符串子集,将各个子集的字符串x原创 2013-06-03 22:37:09 · 544 阅读 · 0 评论 -
UVA 1394 And Then There Was One
约瑟夫环问题小变形,求的是从m开始每数k个人出队,最后剩下的人编号.递推,f[n]表示n个人的从0开始每次数k个人出队后最后剩下的人编号.f[1] = 0 f[n] = (f[n - 1] +k) %n先求出f[n - 1] 然后加上m(从m 开始) 模上n 再加 1(编号从1开始)就是结果.#include using namespace std;const int maxn原创 2013-06-04 09:00:53 · 1116 阅读 · 0 评论 -
UVA 10635 Prince and Princess
这题很明显的是LCS,不过p, q太大,普通的O(n ^ 2 )算法显然会超时这里可以把LCS问题转换成LIS问题,LIS有nlogn的算法,然后复杂度就下来了.因为每个序列都是没重复的,所以可以把序列1重新编号成1 - p + 1,然后序列2按照序列1的数字的对应编号进行转换.例如:序列1{1 7 5 4 8 3 9} 编号后变成{1 2 3 4 5 6 7}序列2{1 4原创 2013-06-04 12:43:31 · 668 阅读 · 0 评论 -
UVA 10891 Game of Sum
用S(i)表示前缀和用f(i, j)代表从序列i到j先手能得到最大值.则方程就是f(i, j) = S(j) - S(i) - min( min{f(i + 1, j) .. f(j ,j)}//从右往左, min{f(i,i), f(i, i + 1), ... f(i, j - 1)} //从左往右)/* * UVA10891.cpp * * Created on: J原创 2013-06-04 17:05:19 · 411 阅读 · 0 评论 -
UVA 11825 Hackers' Crackdown
有n台电脑,每台电脑都运行着n个服务,破坏一个服务,要破坏掉每台电脑上的这个服务,一个黑客想要破坏尽量多到服务,他有一些病毒,每台电脑只能放一个病毒,并且能破坏这个电脑和这个电脑相邻电脑的这个服务.由于n比较小,可以用二进制来压缩状态,设P[i]为第i电脑能够连起来的电脑的二进制表示,然后枚举P的子集(每个子集里的元素的服务全部被破坏),结果存在cover里.然后再次枚举子集,用dp[s]原创 2013-06-05 12:43:32 · 497 阅读 · 0 评论 -
UVA 10670 Work Reduction
贪心 每次选择A,B中费用小的方案.#include #include #include #include #include using namespace std;const int maxn = 102;struct agency{ char name[20]; int price; bool operator<(const agency & rhs)const{原创 2013-06-15 17:37:43 · 422 阅读 · 0 评论 -
UVA 10730 Antiarithmetic?
枚举水过./* * UVA10730.cpp * * Created on: Jun 14, 2013 * Author: root */#include #include #include #define lson l, m, rt << 1#define rson m + 1, r , rt << 1 | 1using namespace std;con原创 2013-06-15 13:33:44 · 471 阅读 · 0 评论 -
UVA 10755 Garbage Heap
给出一个A*B*C大小的长方体,每个小方块都有一个值(可以是负数),求出最大的子长方体和.3维的最大和问题,首先把3维的压缩成2维,再把二维压缩成一维求序列最大连续和./* * UVA10755.cpp * * Created on: Jun 3, 2013 * Author: root */#include #include #include #incl原创 2013-06-03 16:36:35 · 505 阅读 · 0 评论 -
UVA 11054 Wine trading in Gergovia
我的思路刚开始就是从i开始找一直左右最近的需要酒的居民然后和他交易,很不幸的TLE了.后来想了个方法用pre数组表示上一个需要酒的居民,nex表示下一个需要酒的居民,然后每次先按照pre找左边最近需要酒的居民和他交易,更新pre,如果左边没有居民需要了那就往右边找,更新nex,直到卖完酒.更新的时候如果v[i]==0表示这个居民不需要酒了,就while循环往上更新pre直到找到一个需要酒的居民原创 2013-06-10 23:19:46 · 402 阅读 · 0 评论 -
UVA 11549 Calculator Conundrum
很容看出来,一直平方又只取前面n位会构成循环,所以可以模拟,判重的话就用hash#include #include #include using namespace std;const int maxn = 5000;vectorhash1[maxn];bool vis(int h){ int t = h; h = h % maxn; for(int i = 0; i原创 2013-06-01 17:26:18 · 573 阅读 · 0 评论 -
UVA 11384 Help is needed for Dexter
给定序列1...n,每次可以选中序列几个数,然后同时减去相同到一个数,求把序列全部变成0所需要到最小次数.做法是每次选择序列中最中间到位置到那个数,然后中间到最右边的区间到数全部减去这个值,如 1 2 3 4 5 6 选择4 减掉后得 1 2 3 0 1 2 这个序列其实跟1 2 3 是一样的.一直这样到操作直到n变成0,复杂度为lgn#include #include using原创 2013-05-31 12:32:41 · 484 阅读 · 0 评论 -
UVA 11636 Hello World!
刚开始拥有一行"Hello Word!".每次可以按照当前所拥有的句子行进行复制操作粘贴操作,可以选择任意行,问最少需要多少次的粘贴操作能正好得到n行.#include #include using namespace std;int n;int main(){ int cas = 1; while(scanf("%d", &n) && n > 0){ int ans原创 2013-06-08 19:43:48 · 525 阅读 · 0 评论 -
UVA 10970 Big Chocolate
首先切min(n,m) - 1刀,这样就把巧克力分成了宽度为1的巧克力条,然后每条都切长度-1刀.#include #include using namespace std;int n, m;int main(){ while(~scanf("%d%d", &n, &m)){ int ans = min(n, m) - 1; ans += (max(n, m) - 1) *原创 2013-06-09 11:43:18 · 456 阅读 · 0 评论 -
UVA 10795 A Different Task
刘汝佳的训练指南上的例题,自己想不出来.思路:考虑编号最大的盘子.如果这个盘子最初始局面和目标局面位于同一根柱子.那么也这根柱子不用移动.所以要找出所有盘子中不在目标局面的编号最大的盘子k.在移动k之前,k所在的柱子k的上面必须为空,并且k要去的柱子final的最上面的盘子编号也必须大于k,所以如果k上面还有盘子,那么这个盘子必须去 除这两根柱子外的那根柱子上.称k移动过去原创 2013-05-31 16:20:52 · 556 阅读 · 0 评论 -
UVA 11520 Fill the Square
直接枚举每个位置'A' 到'Z'就可以过了.#include #include using namespace std;const int maxn = 11;int n;char grid[maxn][maxn]; bool ok(int i, int j, char ch){ if(i - 1 >= 0 && grid[i - 1][j] == ch)return false原创 2013-05-31 20:25:31 · 453 阅读 · 0 评论 -
UVA 1368 DNA Consensus String
给出一组等长的字符串S求出字母序最小的字符串y,满足y和S的Hamming距离最小.两个字符串的Hamming距离等于相同位置上不同字符的位置个数.y和S的Hamming距离等于y和所有的Si的Hamming距离和.对于每个位置j,求字符次数最多的S[i.j]输出就可以了.#include #include using namespace std;const int ma原创 2013-06-09 17:10:36 · 526 阅读 · 0 评论 -
UVA 10382 Watering Grass
其实题目是区间覆盖.#include #include #include #include #include #include using namespace std;const int maxn = 10010;struct interval{ double l, r; bool operator<(const interval & rhs)const{ retu原创 2013-06-09 21:49:36 · 428 阅读 · 0 评论 -
UVA 10020 Minimal coverage
最小区间覆盖问题.首先对区间按照x进行排序.定义mleft表示能覆盖到的最左边的点,mright表示最右.每次都要找出这么一个点满足,左边坐标小于mright并且右边坐标最大,然后更新mright#include #include #include #include using namespace std;const int maxn = 100010;struct s原创 2013-06-10 09:01:07 · 430 阅读 · 0 评论 -
UVA 434 Matty's Blocks
M比较好计算,N弄了半天时间.首先对于front面的每一个高度front[i],在rightt面里面尽量先找相等的rightt[j],满足没有被其他相同高度front[k] (k != i)的匹配掉,如果找到了就填上front[i],如果没有相等的,找大于front[i]的最右边的rightt[j],然后填掉,如果依旧找不到,那么就留给rightt那边处理.对于rightt做法相同.原创 2013-06-16 14:43:58 · 600 阅读 · 0 评论 -
UVA 10684 The jackpot
简单DP,设dp[i]为到终点为i的最大连续和,则dp[i] = max(dp[i - 1] + A[i] , A[i]),时空复杂度为O(n)其实可以把dp这个数组省掉,用变量B来表示前面的连续和,如果B /* * UVA10684.cpp * * Created on: Jun 7, 2013 * Author: root */#include #in原创 2013-06-07 21:40:29 · 777 阅读 · 0 评论 -
UVA 10820 - Send a Table
求1-n之间互质的对数.首先打表求出欧拉函数的值,然后直接累加1-n的欧拉函数值*2就是答案,注意n=1的时候要特判下.#include using namespace std;const int MAX = 50001;int phi[MAX];int generate_phi(){ for(int i = 0; i < MAX; ++i)phi[i] = 0; phi[原创 2014-03-07 19:13:35 · 453 阅读 · 0 评论 -
HDU1614 | UVA 103 Stacking Boxes
数塔类型的dp,记忆化搜索就可以了.注意杭电的输出最后有一个空格.#include #include #include #include using namespace std;const int MAX = 31;struct Box{ int id, dims[11];}boxes[MAX];bool g[MAX][MAX];int dp[MAX], fa[MAX]原创 2014-03-10 09:01:29 · 745 阅读 · 0 评论 -
UVA 10453 Make Palindrome(区间简单DP)
题意:给出一串字符串,求出需要至少插入多少个字符使得这个字符串变成会问粗原创 2014-05-01 10:42:26 · 543 阅读 · 0 评论 -
UVA 11552 Fewest Flops(DP)
题意:输入一个正整数k和字符串S,字符串的长度保证为k的倍数。把S的字符按照从左到右的顺序每k个分成一组,每组之间可以任意排序,但组与组之间的先后顺序应保持不变。你的任务是让重排后的字符串包含尽量少的“块”,其中每个块为连续的相同字母比如,uuvuwwuv可以分成俩组:uuvu和wwuv,第一组可重排为uuuv,第二组可重排为vuww,连起来是uuuvvuww,包含4个块。思路:这原创 2014-04-18 10:49:38 · 882 阅读 · 0 评论 -
UVA 1456 Cellular Network(贪心,DP)
题意:(摘自LRJ《训练指南》)手机在蜂窝网络中的定位是一个基本问题。假设蜂窝网络已经得知手机处于c1, c2,…,cn这些区域中的一个,最简单的方法是同时在这些区域中寻找手机。但这样做很浪费带宽。由于蜂窝网络中可以得知手机在这不同区域中的概率,因此一个折中的方法就是把这些区域分成w组,然后依次访问。比如,已知手机可能位于5个区域中,概率分别为0.3、0.05、0.1、0.3和0.25原创 2014-04-18 16:37:30 · 738 阅读 · 0 评论 -
UVA 11795 Mega Man's Mission(状态压缩DP)
题意:需要打败N个敌人,初始给出了一个武器,武器能打败一些敌人,打败一个敌人之后就能得到敌人的武器,其武器又可以大原创 2014-04-20 12:56:06 · 740 阅读 · 0 评论 -
UVA 20002 Partitioning by Palindromes(简单DP)
题意:给出一个字符串,求能最少划分成几个连续子串,使得每个子串都是回文串.思路:设dp[i]为前i个字符划分的最优解,那么dp[i] = min(dp[i], dp[j] + 1)这里满足满足j + 1..i为一个回文串.可以用一个二维数组预处理求出x...y的串是否为回文串来做.#include #include #include using namespace std;原创 2014-04-17 17:16:43 · 612 阅读 · 0 评论 -
UVA 1351 String Compression(区间DP)
题意:给出一个字符串S,要求把字符串长度压缩的尽量短,如果有N个连续的字符串s相同,那么就可以把这多个字符串压缩成N(s),这样压缩后的长度为 N的位数+2(两个括号)+s的长度, 同样压缩后的N(s)还可以继续被压缩,求最短的字符串长度.思路:首先找出各个区间的最短周期串长度(即这个区间一个串循环多次组成),定义一个cycle[i][j]表示[i,j]区间的最短周期串长度.然后进行动态规原创 2014-04-25 16:30:21 · 732 阅读 · 0 评论 -
UVA 10791 - Minimum Sum LCM
分解素因子题解这篇写的非常好:http://www.cnblogs.com/scau20110726/archive/2013/01/18/2866101.html#include #include #include using namespace std;const int MAX = 1000001;long long fac[100];bool is_prime[MAX]原创 2014-03-07 15:38:31 · 478 阅读 · 0 评论 -
HDU 1576 A/B
题意很清楚,给出n = A % 9973, B gcd(B, 9973)为1, 求(A/B)%9973.模运算有很多性质:(a+b) % c==(a % c + b % c) %c , (a-b) % c==(a % c - b % c), (a*b) % c==(a % c * b % c),但是除法没有这个性质.不过可以通过求B的乘法逆元来求得.解法:(a / b) % c ==原创 2014-03-08 21:02:08 · 889 阅读 · 0 评论 -
ZOJ 1005 - Jugs | UVA 571 - Jugs
广搜水过去了,状态很少.#include #include #include #include using namespace std;const int MAX = 10001001;const char * ins[] ={"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};struct Nod原创 2014-03-07 20:56:51 · 491 阅读 · 0 评论 -
UVA 111000 The Trip, 2007
先排序在当前已经有的序列中找到这么一个序列满足元素个数最小并且最大元素小于seq[i],将seq[i]插入这个序列的最后,找不到的话就建一个新的序列,放入seq[i]/* * UVA11100.cpp * * Created on: Jun 17, 2013 * Author: root */#include #include #include #in原创 2013-06-18 11:26:12 · 524 阅读 · 0 评论 -
UVA 1445 Cubist Artwork
这题和434差不多,434多了一个求最大能多叠多少个块而保持这个轮廓* * UVA1445.cpp * * Created on: Jun 17, 2013 * Author: root */#include #include #include #include using namespace std;const int maxn = 11;int n, m原创 2013-06-18 11:27:40 · 548 阅读 · 0 评论 -
UVA 10325 The Lottery
容斥原理求集合并集.这里的集合就是给出的M个数,每个数的倍数(小于等于N)就是一个集合.先求出最小公倍数,然后 N/最小公倍数 就可以得出每个子集的元素数量.#include #include using namespace std;long long gcd(long long a, long long b){ return b == 0 ? a : gcd(b, a %原创 2013-07-08 19:06:18 · 1370 阅读 · 0 评论 -
UVA 10994 Simple Addition
#include #include using namespace std;inline long long getsum(long long p, long long q){ return (p + q) *(q - p + 1) / 2;}long long p, q;int main(){ while (scanf("%lld%lld", &p, &q)){ if(p原创 2013-07-08 21:29:07 · 628 阅读 · 0 评论 -
UVA 138 - Street Numbers
求1 + 2 + ... (C - 1) == (C+ 1) + (C + 2) + ... + N利用求和公式可以得出C^2 = N * (N + 1) / 2,枚举n.两边开根号,如果C的值是整数那么就是一个解.直接输出答案了.#include using namespace std;int main(int argc, char const *argv[]){原创 2014-03-05 22:01:54 · 543 阅读 · 0 评论 -
UVA 128 - Software CRC
给出一串字符串,求其循环冗余校验码.求法:把整个字符串看成一个整数m,第一个字符作为这个整数的最高字节,第二字作为次高字节. etc...要求在这个整数最后加上两个字节变成m2,使其整除34943.解法:快速幂取模,粒度为一个字节.#include #include using namespace std;#define MOD 34943char message[1025原创 2014-03-06 13:09:57 · 731 阅读 · 0 评论 -
UVA 11029 - Leading and Trailing
求n^k的前3位和后3位.后三位:通过快速幂取模求得.前三位:将n^k转换成10^(k*log10(n)),用fmod求得k*log10(n)的小数部分t, 10^(t)的整数部分就是第一位, 10^(2 + t)的整数部分自然就是前三位了.#include #include #include #include #include using namespace std;l原创 2014-03-08 12:17:19 · 548 阅读 · 0 评论