
UVa
文章平均质量分 66
GooMaple
这个作者很懒,什么都没留下…
展开
-
UVa 10012 - How Big Is It?
以为很简单,十分钟敲了一个全排列回溯,结果WA了。想了半天,才想到可能存在两个半径很大的圆相切,中间夹着很多小的圆(这样单纯的全排列只判断相邻两圆的话就可能出现圆圆相交的情况),这样就需要加一个圆心坐标和一个原点记录位置来做特判,令当前放置的圆与前面所有的圆相切求出最大的据原点的距离(这样就可以保证排除圆圆相交的情况),再加上前面的距离即为放置这个新的圆的位置坐标。代码如下:#incl原创 2012-09-12 18:26:37 · 1395 阅读 · 0 评论 -
UVa 10400 - Game Show Math
DFS+剪枝。因为题目中要求每一步运算的范围都不会超过-32000~32000这个区间,因此可以将每一步运算的状态存在一个vis数组里,只要重复则不必要再往下计算,这样就可以将3的99次方的运算量降为99*4*64000。代码如下:#include #include #include #include #include #include using namespace st原创 2012-09-11 16:29:44 · 769 阅读 · 0 评论 -
UVa 331 - Mapping the Swaps
回溯即可(注意题意是只能交换相邻的两个元素)。代码如下:#include #include #include #include #include #include using namespace std;int a[6], b[6], cct, fct, n;void dfs(int cur, int fi){ if(cur >= fct) {原创 2012-09-10 22:23:43 · 595 阅读 · 0 评论 -
UVa 193 - Graph Coloring
回溯,枚举所有点的黑白情况,然后判断可行性。代码如下:#include #include #include #include #include #include using namespace std;int map[102][102], node[102], save[101], n, k, cct;int judge(int cur){ for(int i原创 2012-09-08 09:23:14 · 1164 阅读 · 0 评论 -
UVa 10344 - 23 out of 5
开始用的回溯TLE了,后来改用全排列+DFS AC。代码如下:(0.728s):#include #include #include #include #include #include using namespace std;int a[5], flag;void solve(int cur, int sum){ if(cur == 5) {原创 2012-09-05 20:41:15 · 1390 阅读 · 2 评论 -
UVa 11205 - The broken pedometer
求可区分出所有行的最小列数,用位向量法生成子集,然后枚举最小子集。最需要注意的是其0与1之间可能不止一个空格,开始用char型数组 scanf("%c%c", &a[i][j], &c); 读取的,因为这个WA了好几次,如果直接用int型数组求则可以省去很多麻烦。代码如下:#include #include #include #include #include #includ原创 2012-08-21 11:22:53 · 1206 阅读 · 0 评论 -
UVa 10716 - Evil Straw Warts Live
题意:判断一个字符串是否能转化成回文串,如果可以就统计转化成回文串所需的最少交换次数。贪心,思路就是先将串两端固定(对应字母移至对应位置),依次向中间夹逼,因为只有依次将字母先放到两端,才可以减少剩下字母交换的次数,先把哪对字母放到两端都可以,因为可以证明出无论移动哪对字母只要是每次都将其放到两端其最后交换次数是一样的。由题意不难判断如果各个字母出现次数均为偶数,那他一定可以转换成回文串,原创 2012-08-17 14:19:49 · 1047 阅读 · 0 评论 -
UVa 539 - The Settlers of Catan
搜索回溯。其实本来是比较简单的一个题,但因为看错题,刚开始做麻烦了,不过也AC了,觉得程序跑的有点慢,所以看了一下其他人写的代码,结果发现自己审错题想麻烦了。题目中不会出现两个点之间出现多条重复边的情况,而我刚开始考虑到这种情况,由此便不能用二维数组 vis[x][y] 的方式表示某两点之间的边是否访问过,我是用了一个一维数组将所有边都存起来然再处理的,这样过程中会非常的麻烦。而如果不考虑两点原创 2012-08-31 22:19:03 · 720 阅读 · 0 评论 -
UVa 167 - The Sultan's Successors
经典“八皇后问题”,把所有情况全部遍历一遍,统计最大值即可。代码如下:#include #include #include #include #include using namespace std;int a[9][9], vis[3][20], save[9], n, tot;void search(int cur){ int i; if(cur原创 2012-08-31 18:04:39 · 1662 阅读 · 0 评论 -
UVa 301 - Transportation
枚举子集+回溯。枚举子集时,需要在每一次递归的过程中进行条件判断,而不能按一般情况放到最后进行判断。代码如下:#include #include #include #include #include using namespace std;int n, m, num, _max, cal[8];struct point{ int start, des, ticket原创 2012-09-04 21:20:28 · 905 阅读 · 0 评论 -
UVa 639 - Don't Get Rooked
类似“八皇后问题”,但加了“墙”的概念,如果有墙相隔,则同一行墙两边可同时存在两个元素。枚举子集+判断可行性,在枚举子集时,可以进行适当剪枝,如此可以减少很多不必要的枚举,比如:当n == 4时,其最大的的“车”的位置为8个,则我们可以加一个计数器,最多将子集的枚举量设为8,超过8则不再往子集中加入元素。代码如下:#include #include #include #inc原创 2012-08-29 19:06:16 · 1122 阅读 · 0 评论 -
UVa 216 - Getting in Line
乍一看,像最小生成树,实际不用,因为数据量较小(最大8台电脑),所以直接模拟全排列算最小值就可以。代码如下:#include #include #include #include #include using namespace std;struct point{ int x, y;} po[10];int n;double save_d[10], dis原创 2012-08-28 19:27:19 · 996 阅读 · 0 评论 -
UVa 110 - Meta-Loopless Sorts
实际就是求一个全排列,因为给出的数字最大是8,所以最多有8!种情况。根据给出的样例我们可以将其看成向已给出的排列中倒叙插入新元素(其实就是插空),如:给出n=3,则最开始为 a,然后将b插入最后为ab,再插入c,为abc,c依次向前插入acb,cab,然后递归返回上一层,b向前移顺序变为ba,继而相继产生bac,bca,cba。代码如下:#include #include #i原创 2012-08-27 21:01:50 · 1176 阅读 · 0 评论 -
UVa 131 - The Psychic Poker Player
一手牌(规则请见:http://dpk888.com/school/discussions/%E4%B8%80%E6%89%8B%E7%89%8C%E7%9A%84%E7%89%8C%E5%9E%8B-poker-hands#per_page=10),枚举 + 模拟,关键是明白其桌子上的牌相当于一个栈,只有丢掉手里相应数量的牌才可以从栈中依次抽出相应数量的牌来维持手里始终有五张牌,依此枚举。原创 2012-08-21 16:55:01 · 677 阅读 · 0 评论 -
UVa 140 - Bandwidth
全排列,统计记录每个排列中“带宽”最大的值,最后输出所有最大值中最小的那个。代码如下:#include #include #include #include #include #include using namespace std;int cct, ahl[27], map[27][27];int save[9], node[9];char a[500];int原创 2012-09-12 23:11:08 · 2080 阅读 · 1 评论 -
UVa 208 - Firetruck
总体思路很简单,回溯,但直接用矩阵回溯会TLE。因为可能在1与目标点之间不存在通路(即:1 与 目标点分别存在于两个隔绝的联通图中),这样如果直接从1开始往下回溯,会无谓检查到许多无用的点浪费时间,我们可以先将所有与目标点联通的点存于一个数组中,仅在这个数组中查找,就省去很多无谓的查找时间。代码如下:#include #include #include #include #in原创 2012-09-15 16:12:03 · 1679 阅读 · 0 评论 -
UVa 10001 - Garden of Eden
这个题难点在理解题意,读了n遍都没有读懂,最后看的结题报告上的解释才明白它的意思。题意:一共有256种自动机的编译形式,给你其中一种,你可以相应转换为对应的二进制数字串(即为表格中的一个New State),再根据这个标准编译串(New state)将给出的串逆转换,如果能逆转换成一个符合要求的新串则说明存在串可以转换为给出的串,则输出“REACHABLE”,否则不存在,输出“GARDEN O原创 2012-09-19 22:19:43 · 1748 阅读 · 1 评论 -
UVa 11054 - Wine trading in Gergovia
贪心,本来想的贪心方法是找到每一个需求量为正数的居民,往两边搜,搜到最近的那个需求量为负的居民,权衡需求量与销售量不难最少使其中的一个变为零,另外一个如果不为零,则减去或加上另一个的需求量,不断重复操作,直到所有居民的数值均为零。虽然后来中间也做了不少剪枝,但最后还是TLE了。后来参考了http://hi.baidu.com/knowledgetime/blog/item/fbcfe9c9b6原创 2012-08-10 16:17:16 · 1475 阅读 · 0 评论 -
UVa 10020 - Minimal coverage
基本思路:已知目标线段[0,m],在所有给出线段左端点值小于目标线段左端点值的线段中,选出所对应右端点值最大的点,并用y的值不断更新左端点的值,直到y值大于M,跳出。在做之前需要预处理一下,将与目标线段无交集的线段全部滤去,并判断给出的左右线段的最右值和最左值是否能将目标线段覆盖。代码如下:#include#include#include#include#include原创 2012-08-02 11:12:43 · 811 阅读 · 0 评论 -
UVa 10125 - Sumsets
方法一:可以暴力枚举,其实用枚举方法水过纯属意外。(可以试一下1000个1这组数据,它是跑不出来的。)方法二:可以将问题转化为 a+b=d-c。这样,只要将a+b的值全部算出来,存至哈希表内,再枚举d,c的值看两边是否相等从而推出d,就可以将复杂度由O(n4)降之O(n2)左右的水准,便可以过了。代码如下:方法一(枚举 1.600s):#define test#include原创 2012-10-16 23:00:33 · 2316 阅读 · 1 评论 -
UVa 10148 - Advertisement
一个区间取点问题,按右端点排序。从右端开始标注,保证每段区间都有K个标注点,小于K的区间则保证其区间的点全部被标注,在标注时注意因为范围是-10000~10000,因此需要用一个20000的数组存,需将整体范围往右移动10000(例:标注-10000为a[0] = 1,标注0为a[10000] = 1),保证其全部大于零。#include#include#include#includ原创 2012-08-15 16:01:19 · 1018 阅读 · 0 评论 -
UVa 10718 - Bit Mask
贪心,M在保证与N做OR运算的结果最大的基础上,使M的值最小。可以先将上界和下界都转化为二进制,先确定M的最高位,M的最高位可以从u的最高位开始试(理由很简单),再依次确定之后的数字,每个数字尽量保证与N的二进制相应位置的数字互补(如果N的二进制的某一位是 1,则M的相应位尽量为0,这样才也能保证总值最大,M值尽量小),但也要保证在每一位贪心的过程不能使M值超过[N,M]的范围。代码如下:原创 2012-08-09 20:40:19 · 1070 阅读 · 1 评论 -
UVa 11129 - An antiarithmetic permutation
本来以为是比较简单的一个题,结果是理解错题意了,本以为题意是相邻的三个数不能为等差数列,结果WA了,看了其他人的代码才知道题目的意思是不相邻的只要是一个方向的也不能为等差数列。这样难度就比较大了,思考了半天也没想出什么好办法来,参考了他人的代码,基本思路是用递归将序列不断分为奇偶序列(按位置分),然后在合并,直到不能分为止,得到的便是没有等差子序列的排序。代码如下:#include#原创 2012-08-07 15:59:58 · 988 阅读 · 0 评论 -
UVa 10706 - Number Sequence(POJ 1019)
乍一看数据范围真是有点吓人,单纯暴力肯定超时。观察数字可以找到规律:数字范围 数字位数范围 每个数字宽度 总共数字所占位数1~9 : 1~9. 1 4510~99: 11~189 2原创 2012-08-06 10:18:55 · 1229 阅读 · 0 评论 -
UVa 311 - Packets
题目大意:有1*1,2*2,3*3,...六种小包裹,往6*6的箱子里装,给出六种小包裹各自的数量,求出最少用的箱子的个数。贪心,思路还是比较简单的,先从大的开始往小的装。6*6的包裹,每个单独装一个箱子;5*5的包裹,可以和11个1*1的搭配;4*4的包裹,可以喝5个2*2的搭配;...以此类推(注意3*3的有四种搭配方案)。这里可以每次优先用2*2的去填原创 2012-08-02 11:09:51 · 1152 阅读 · 0 评论 -
UVa 10037 - Bridge
贪心问题,有两种最优方式,一种是最小次小走与最大次大走轮流的搭配,另一种是最小最大一块走的搭配,需要一定的判定条件 ~在此给出两种不同情况的数据第一种(样例):412510第二种:41345代码如下:#include#include#include#include#includeusing namespace std;原创 2012-08-02 11:08:16 · 656 阅读 · 0 评论 -
UVa 10391 - Compound Words
好久没有1Y了 ~~~hash来做,先将所有字符串存入哈希表,然后将每一个字符串分成两个子串,分成的两个子串能在哈希表中找到,则其为“compound words”,将其输出。代码如下:#include #include #include #include #include #include using namespace std;const int MAXSIZ原创 2012-10-16 18:32:07 · 1261 阅读 · 0 评论 -
UVa 757 - Gone Fishing
贪心+暴力,从近至远依次枚举可以到达的钓鱼地点,用总时间减去中途消耗的时间,这样就可以将其当成在各个钓鱼地点之间随意转移(实际题目中给出是单方向前行的),然后在已到达的最远的钓鱼地点之内的所有钓鱼地点上按每次钓最大值的鱼做贪心,若时间用不完,则剩余时间加到第一个钓鱼地点上。注意,钓鱼地点最初的钓鱼值可能为零。代码如下:#include#include#include#includ原创 2012-08-16 12:10:03 · 920 阅读 · 0 评论 -
UVa 11100 - The Trip, 2007
贪心,类似于“陶瓷娃娃”,可以想一下,如果全是不同规格的背包,那么他们就可以依据大小关系一个套一个全部套进一个包中。因此,包的个数取决于重复次数最多的那个规格的包,这个题难点在于怎么将其按套件输出,这里可以在排序之后从最大的依次开始往后输出,每次输出的序列以最大重复次数为公差依次向前输出直到序数小于0为止。不过在这里还是WA了一次,看到样例都是输出的一对一对的数字,本还以为是只输出每对套层原创 2012-08-08 20:54:41 · 1437 阅读 · 0 评论 -
UVa 10591 - Happy Number
题意:将给出数各个位上的数字的平方和加起来得到新的数字,依次往下推新数字,直到得到得到数字1(Happy number)或是与之前重复的数字(unhappy number)。利用哈希表查找判重或是直接打表,因为输入最大是10的9次方的数字,因此得出的数字最大为9*9*9 = 729。代码一(hash 0.020s):#include #include #include #in原创 2012-10-07 14:22:25 · 933 阅读 · 0 评论 -
UVa 10382 - Watering Grass
实际上就是区间覆盖的变形,显然圆形能覆盖的矩形区域为圆形与总区域相交的长度,这就将圆形全部转换成了线段,这样就可以按区间覆盖来做了。但是这个题比较恶心的地方是卡了比较严格的精度,这里需要额外注意一下。代码如下:#include#include#include#include#includeusing namespace std;struct point{原创 2012-08-15 11:51:12 · 1262 阅读 · 0 评论 -
UVa 10670 - Work Reduction
贪心题,只要每一步都保证B的费用小于等于A的费用,则一直用B方案,否则用A方案结束,唯一值得注意的是在B方案减半时不能使N的值小于M的值(题目中有要求)。代码如下:#include#include#include#include#includeusing namespace std;struct agency{ int A, B, V; char na原创 2012-08-10 21:10:22 · 859 阅读 · 0 评论 -
UVa 10720 - Graph Construction
贪心,为保证其尽可能为图,要优先考虑大度数之间的点优先连接。在这里可以采取依次减度数的方法推断能否构成图。如:3,3,2,2,1五个点,从度数最大的开始考虑,先去掉3,则后面紧接的三个点度数依次减去1,剩下的四个点排序后为2,1,1,1,再去掉度数最大的2,后面的两个点一次减去1,排序后剩下三点为1,0,0,1后的一点度数再减去1,则为-1,明显不成立,为Impossible。代码如下:原创 2012-08-10 14:31:20 · 857 阅读 · 0 评论 -
UVa 10887 - Concatenation of Languages
将A集合的词与B集合中的词按要求合成一个词,然后利用哈希表判重。代码如下:#include #include #include #include #include #include using namespace std;const int MAXSIZE = 2250002;int num, head[MAXSIZE], next[MAXSIZE];char a[15原创 2012-10-17 23:30:26 · 1532 阅读 · 1 评论 -
UVa 141 - The Spot Game
题意实际上要求每次比较四个图形(其中三个是旋转翻转得到的),然后通过比较如果这四个图形之前都没有出现过,则将这四个图形全部存起来,以备以后进行比较(还有一点需要注意的,就是如果原图形经过旋转得到的图形和原图形相同,这种情况是不算重复的)。刚开始理解成每次几个比较完之后只把原图形存起来了,WA了好几次。方法:因为数据量较小,直接将二维图存成一维数组,然后暴力枚举比较就可以。代码如下:#i原创 2012-10-19 22:02:00 · 1093 阅读 · 0 评论 -
UVa 532 - Dungeon Master
BFS ~不解释。代码如下:#include #include #include #include #include #include using namespace std;const int MAXSIZE = 1000003;int l, r, c, fl, fr, fc, dis[MAXSIZE];int p1[6] = {1, -1, 0, 0, 0, 0};原创 2012-10-30 18:31:08 · 918 阅读 · 0 评论 -
UVa 10085 - The most distant state
八数码问题的变形,bfs+哈希,打印路径时花了点时间,用哈希表next数组的原理进行回退就可以将问题解决。代码如下:#include #include #include #include #include #include using namespace std;const int MAXSIZE = 1000003;const int dx[4] = {-1, 1, 0原创 2012-10-26 21:34:16 · 854 阅读 · 1 评论 -
UVa 10603 - Fill
倒水问题,bfs+哈希,需要将每一步的总倒水量全部存起来,最后再排一次序,将小于等于d 的最大的d及其匹配的总到水量输出即可。代码如下:#include #include #include #include #include #include using namespace std;const int MAXSIZE = 250003;const int p1[6] =原创 2012-10-27 15:05:39 · 792 阅读 · 0 评论 -
UVa 10034 - Freckles
最小生成树,Kruskal算法。代码如下:#include #include #include #include #include #include using namespace std;const int MAXN = 5052;int n, p[MAXN], r[MAXN], u[MAXN], v[MAXN];double dis[MAXN], x[102], y[原创 2012-11-05 22:47:24 · 1220 阅读 · 0 评论 -
UVa 10397 - Connect the Campus
因为已经有部分建筑用电线连起来了,要求还需要多少电线才可以将全部建筑连起来,只需要将用电线连起来的城市之间的距离设为0,再用Kruskal。代码如下:#include #include #include #include #include #include using namespace std;const int DMAXN = 755;const int EMAXN =原创 2012-11-06 19:47:33 · 1131 阅读 · 0 评论