10 2012 档案
POJ 3352 Road Construction
摘要:题意:给定一个无向连通的公路网,当某些公路路段检修的时候可能会由于该段公路不通,可能会使某些旅游点之间无法通行,求最少需要新建多少条公路,使得任意对一段公路进行检修的时候,所有的旅游景点之间仍然畅通。思路:构造双连通图,具体步骤:[构造双连通图]一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图。把每个双连通子图收缩为一个顶点,再把桥边加回来,最后的这个图一定是一棵树,边连通度为1。统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf。则至少在树上添加(leaf+1)/2条边,就能使树达到边二连通,所以至少添加
阅读全文
POJ 2762 Going from u to v or from v to u?
摘要:POJ 2762 Going from u to v or from v to u?题意:有n个山洞m条路,问任意两点x,y能否存在从x到y或者从y到x。思路:1、注意是或而不是和,所以“缩点”后,由于“缩点”内的点相互可达,所以不需要管“缩点”内的点。注意,不是判断强连通的数量为1,而是判断是否是弱连通。2、如果两点不可达那么在拓扑排序时,该两点谁也不是谁的前驱和后继,所以在拓扑排序时只要同时出现至少两个入度为0的点,那么这些点一定互不可达,所以只要判断拓扑的方式是否唯一即可。第一种方法:只要用拓扑判断入度为0的点是否为1个,如果有多个,就出现在分叉,不可能从x到y。第二种方法:从入度为0的
阅读全文
POJ 1236 Network of Schools
摘要:大意:第一问:最小的数量需要收到复制软件从而使得所有学校都有软件。(You are to write a program that computes the minimal number of schools that must receive a copy of the new software)第二问:建立最小数量的“路”,使得任意的学校两两可达。思路:第一问,“缩点”之后判断入度为0的强连通分量。第二问,与Hdu 2767很相似,求连接最小的路使得图变为强连通图。判断入度0与出度为0的最大值。CODE:#include<iostream>#include<cstdlib
阅读全文
Hdu 2767 Proving Equivalences
摘要:大意:给你一个图,让你使用数量最小的边使得图变成强连通图。思路:我们发现如果图是强连通的,那么每一个顶点的出度与入度必定不为0。所以我们可以将图“缩点”,然后去统计出度或者入度为0的点,取两者的最大数。(可以手推一遍)CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>usingnamespacestd;#defineMAXN50010#defineMAXM100010structEdge{intv,next;}edge[MAXM];intfirst[M
阅读全文
POJ 2553 The Bottom of a Graph
摘要:根据题意求的是出度为0的强连通分量的点的个数,这与POJ 2186有非常相似的地方,因为入度不方便统计,所以直接统计出度,出度为0即为正确答案。思路:利用Tarjan求强连通分量,并求出入度为0的强连通分量。另外,题目要求输出从小到大,而我们知道Tarjan求强连通分量的顺序就是从小到大,所以不需要记录、排序然后输出。CODE:#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>usingnamespacestd;#defineMAXN10010#defineMA
阅读全文
POJ 2186 Popular Cows
摘要:大意:牛牛之间互相喜欢,而且这种喜欢具有传递性,要求你求出最受欢迎的牛牛们的个数(A single integer that is the number of cows who are considered popular by every other cow.)思路:通过“缩点”之后,然后求强连通分量出度的个数,如果为一,那么求出这个“缩点”里所有牛牛的个数。如果大于一,没有符合条件的,手推一遍即可证实。CODE:#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib&g
阅读全文
Hdu 1269 迷宫城堡
摘要:强连通分量Tarjan模板,明天再来理解下。顺便学学二分图匹配,最小割,最大流等,接触了大概有一个多月了,看了好久的论文,不过大部分都没实现过。CODE:#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>usingnamespacestd;#defineMAXN10010#defineMAXM100010structEdge{intv,next;}edge[MAXM];//边结点数组intfirst[MAXN],stack[MAXN],DFN[MAXN],Low
阅读全文
Hdu 1625 Numbering Paths
摘要:大意:让你求城市与城市之间可到达路径的条数。思路:Floyd变形,需要对Floyd有深刻的理解。题目的关键在于确定是否有无环。首先通过Floyd预处理,把所有的路径数求出来,即d[i][j]+= d[i][k] * d[k][j]。然后确定有无环,如果存在环的话,即d[k][k] != 0(存在环),那么所有的点i,j,只要经过了k(i->k->j),那么它的路径数是不能确定的,反之,确定。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>
阅读全文
UVA 125 Numbering Paths
摘要:大意:让你求一个城市到另一个城市的路径的条数。思路:Floyd变形,关键是确定有无环。首先通过Floyd预处理,把所有的路径数求出来,d[i][j]+= d[i][k]*d[k][j],然后确定有无环,如果存在环的话,即d[k][k] != 0(存在环),那么所有的点i,j,只要经过了k(i->k->j),那么它的路径数是不能确定的,反之,确定。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>usingnamespacestd;#defi
阅读全文
UVA 104 Arbitrage
摘要:大意:给出n种国家的货币汇率,一定金额的某种货币经过一系列汇率变换后再换成原来货币,金额增加了,求出这样的一个变换,要求变换步数最少。Floyd变形,关于Floyd动态规划的理解。状态转移方程:f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j])f[k][i][j]表示只经过前k个点(包括k),从i到j的最小值。当k从1到n时,就是从i到j的最小值。我们熟悉的用二维数组的写法实际上是对空间的一种压缩。解释一下:计算只经过前k个点,从i到j的最小值时,有两种情况需要考虑:经过第k个点和不经过第k个点。经过第k个点则距离应是从i到k的最小值和
阅读全文
UVA 10803 Thunder Mountain
摘要:大意:让你求一组城镇A与B之间的最大距离,不能大于10,如果有城镇不连通,则输出Send Kurdy。思路:FloydCODE:#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<queue>usingnamespacestd;#defineMAXN1100#defineINF0X3F3F3F3Fstructnode{doublex,y;}a[MAXN];intn,m;doubled[MAXN
阅读全文
UVA 515 King
摘要:差分约束,题目的关键在于建模的过程,这题题意比较难懂,数据各种BT,以前在HDU上过的,到UVA就不能过。题目大意: 给定一个序列的长度,然后给定若干关系,这个关系是子序列各个元素之和与某个给定整数的大小关系。要求是否存在这样一个序列满足所有给定的若干关系。思路:本题主要就是需要想到利用前n个元素的和为替代。即设s[i] = a[1] + a[2] + …a[i]。 a[si] + a[si+1] + … + a[si + ni] = s[si + ni] - s[si - 1];所以如果a[si] + a[si+1] + … + a[si + ni] < k 则 s[si + ni]
阅读全文
UVA 10986 Sending email
摘要:最短路CODE:#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<queue>usingnamespacestd;#defineMAXN20010#defineINF0X3F3F3F3FstructEdge{intu,v,w;intnext;}edge[MAXN*5];intfirst[MAXN],d[MAXN];intn,m,cnt;ints,e;voidinit(){cnt=0;memset(first,-1,sizeof(fi
阅读全文
UVA 558 Wormholes
摘要:SPFA判环。CODE:#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<queue>usingnamespacestd;#defineMAXN1100#defineINF0X3F3F3F3FstructEdge{intu,v,w;intnext;}edge[MAXN*4];intfirst[MAXN],d[MAXN];intn,m,cnt;voidinit(){cnt=0;memset(first,-1,sizeof(first)
阅读全文
UVA 10369 Arctic Network
摘要:题目大意:南极有n个科研站, 要把这些站用卫星或者无线电连接起来,使得任意两个都能直接或者间接相连。任意两个都有安装卫星设备的,都可以直接通过卫星通信,不管它们距离有多远。 而安装有无线电设备的两个站,距离不能超过D。 D越长费用越多。现在有s个卫星设备可以安装,还有足够多的无线电设备,求一个方案,使得费用D最少(D取决与所有用无线电通信的花费最大的那条路径)。分析与总结:很自然的想到求最小生成树,然后为了使得D费用最少,就要让其中路径最长的那些用来安装卫星。 s个通信卫星可以安装s-1条最长的那些路径。 那么, 最小生成树中第p-s大的路径长度就是D。只需要求出最小生成树上的所有路径长度,排
阅读全文
UVA 10397 Connect the Campus
摘要:大意:让你用最小的cost连接所有的城市,有些城市已经连接好啦。思路:最小生成树,连接好了的道路w[u][v] = w[v][u]赋值为0.CODE:#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<queue>usingnamespacestd;#defineMAXN1100#defineINF0X3F3F3F3Fintn,m;structnode{doublex,y;}a[MAXN];d
阅读全文
UVA 10806 Dijkstra, Dijkstra.
摘要:大意:给你一个无向图,让你求到达终点的最短距离然后再返回求最短距离,但是不能经过同一条边两次。思路:我的思路是去的时候求一次最短路,回来是将所有边反向,然后求一次最短路,测试数据过了,如果是有向图的话,应该可以AC,无向图不知为啥WA,欢迎大牛们指点。等我学了最小费用流的时候再来看看。12.10.25CODE:#include<iostream>#include<cstdio>#include<cstring>#include<queue>usingnamespacestd;#defineMAXN1000001#defineINF0x3f3f3f
阅读全文
UVA 10801 Lift Hopping
摘要:大意:给定一定的电梯以及电梯可以到达的楼层,求坐电梯到特定的位置最小的时间。思路:1、建立无向图,明确一个电梯上的楼层是相互可达的,以每一个楼层代表一个顶点建图。2、由于换乘电梯需要60s,那么什么时候换乘电梯呢?由于同一个电梯上的楼层是相互可达的,所以我们只有通过另外一个电梯找到了更小的搭乘时间时候我们才会松弛。3、上第一个电梯时是不需要时间的,为了Dijkstra处理方便,我们加上,我们最后减去60即可。4、松弛时判断的条件是d[y] > d[x] + w[x][y] + 60。CODE:#include<iostream>#include<cstdio>#i
阅读全文
UVA 10099 The Tourist Guide
摘要:大意:给定一张无向图,让以最少的次数将起点的全部乘客运往终点,图中的每个节点有容量限制。思路:与UVA 10048 差不多,都可以用Floyd动态规划去解决。d[i][j] = max(d[i][j], min(d[i][k], d[k][j]));另外:导游也算一个容量。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>usingnamespacestd;#defineMAXN110intd[MAXN][MAXN];intn,m;voidinit()
阅读全文
POJ 2728 Desert King
摘要:最优比率生成树。CODE:#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<cmath>usingnamespacestd;#defineeps1e-4constintINF=0x3f3f3f3f;constintMAXN=1010;doublew[MAXN][MAXN],d[MAXN];doubledis[MAXN][MAXN],cost[MAXN][MAXN];intn,m;structnode{doublex,y,z;}a[M
阅读全文
POJ 3621 Sightseeing Cows
摘要:SPFA+0/1分数规划。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<queue>usingnamespacestd;#defineMAXN1010#defineINF0X3F3F3F3F#defineeps1e-7structEdge{intv,next;doublew;}edge[MAXN*5];doubled[MAXN],num[MAXN];intfirst[MAXN];intn,m,cnt;voidinit(
阅读全文
Hdu 4081 Qin Shi Huang's National Road System
摘要:大意:有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点。秦始皇希望这所有n-1条路长度之和最短。然后徐福突然有冒出来,说是他有魔法,可以不用人力、财力就变出其中任意一条路出来。秦始皇希望徐福能把要修的n-1条路中最长的那条变出来,但是徐福希望能把要求的人力数量最多的那条变出来。对于每条路所需要的人力,A是指这条路连接的两个城市的人数之和,对,是两个城市。最终,秦始皇给出了一个公式,A/B,A是指要徐福用魔法变出的那条路所需人力, B是指除了徐福变出来的那条之外的所有n-2条路径长度之和,选使得A/B值最大的那条。思路:这道题可以看做是次小生成树的变形,我
阅读全文
POJ 1679 The Unique MST
摘要:关于次小生成树的构造:在求最小生成树时,用数组Max[i][j]来表示MST中i到j最大边权。求完后,直接枚举所有不在MST中的边,把它加入到MST中构成一棵新的树,且该树有环,此环是由刚加入的边(i,j)造成的,所以可以通过删除Max[i][j]即可得到新的一颗树,且所有的该类树中必有一棵为次小生成树。如图所示:G,H不是MST上的边,通过加入边(G,H),得到一个环(B,H,G),由于在计算最小生成树时已经计算出G,H之间最大边权为Max[G][H] = BH,所以通过删除BH即可得到一棵此时最小的生成树,然后更新答案即可。实际上,我们知道MST的构造是具有贪心性质的,假如上图是一棵MST
阅读全文
poj 2449 Remmarguts' Date
摘要:第K短路问题,可以用A*来写,我了个去,遇到了超级令人无语的错误... 如何求第K短呢?有一种简单的方法是广度优先搜索,记录t出队列的次数,当t第k次出队列时,就是第k短路了。但点数过大时,入队列的节点过多,时间和空间复杂度都较高。现在有另一种更加高效的算法A*。介绍一些关键的概念:首先,对于状态空间搜索,是可以提出一个通用的搜索算法框架的,而这个框架中则主要使用了open,和closed两个表。open表,保存了当前待扩展节点,closed表则保存已扩展节点,而BFS DFS也可以纳入这个框架,比如DFS中使用的white black gray染色,实际于 open closed便是对应的。
阅读全文
POJ 2503 Babelfish
摘要:字符串哈希函数。思路:采用ELFhash函数,即(它用于UNIX的“可执行链接格式,ELF”中,这里把它写成C函数),见《算法艺术与信息学奥赛》P96CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<queue>usingnamespacestd;#defineMAXN149993typedefunsignedintUL;intfirst[MAXN],cnt;structnode{chars1[11],s2[11];int
阅读全文
ACM/ICPC
摘要:图论路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 Euler Path / Tour Hamilton Path / Tour 特殊图的Hamilton Path / Tour 构造生成树问题 最小生成树 第k小生成树 最优比率生成树 0/1分数规划 度限制生成树连通性问题 强大的DFS算法 无向图连通性
阅读全文
UVA 567 Risk
摘要:CODE:#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>usingnamespacestd;#defineMAXN25#defineINF0x3f3f3f3fintn,times;longlongd[MAXN][MAXN];voidinit(){for(inti=1;i<=20;i++){for(intj=1;j<=20;j++){if(i==j)d[i][j]=0;elsed[i][j]=INF;}}}voidFloyd(){intu,v;
阅读全文
UVA 10048 Audiophobia
摘要:大意:给你一个图,以及出发点与起始点,让你求这两者之间的最小的最大权值。思路:动态规划,Floyd的变形,我理解起来比较困难,关键是我接触动态规划较少。CODE:#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>usingnamespacestd;#defineMAXN110#defineINF0X3F3F3F3Fintd[MAXN+10][MAXN+10];intn,m,q;voidinit(){for(inti=1;
阅读全文
UVA 10034 Freckles
摘要:大意:使用最小连线使得所有给定的点连在一起。思路:最小生成树。CODE:#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>usingnamespacestd;#defineMAXN110#defineINF0X3F3F3F3Fstructnode{doublex,y;}a[MAXN];doublew[MAXN][MAXN],d[MAXN];intn;doubledist(nodea,nodeb){returnsqrt((
阅读全文
UVA 10391 Compound Words
摘要:大意:判断一个字符串是否由给定的一些字符中两个组成。思路:可以用hash,也可以用字典树+枚举,字典树似乎比较快。CODE:#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>usingnamespacestd;#defineMAXN120010charsave[120010][30];structTrie{Trie*next[26];intvalue;Trie(){for(inti=0;i<26;i++)next[i]=0;value=0;}};voidi
阅读全文
如何构造字符串哈希函数?
摘要:/*哈希函数的构造方法其实和建立邻接表的方法非常类似*/#include<stdio.h>#include<string.h>#include<stdlib.h>charst[121000][30],temp[30];intfirst[10000019],next[121000];voidinit(){memset(first,-1,sizeof(first));}inthash(char*key)//ELHhash{ULh=0;while(*key){h=(h<<4)+*key++;ULg=h&0xf0000000L;if(g)h^=g
阅读全文
UVA 138 Street Numbers
摘要:我只会用二分枚举,即sum(1,mid-1) == sum(mid+1, n) -->2*pow(mid, 2) == n*(n+1); 然后去网上看了看其他人是用打表的方式过去的,今天第一次接触了暴力打表。共同进步啊。由于我不知道最大数是多少,于是我将n的范围开到了一亿,反正也只要前十组,如果少了就增加n的范围。打表CODE:#include<stdio.h>#include<string.h>intmain(){freopen("UVA138.cpp","w",stdout);longlonginti,j,x,mid,y
阅读全文
UVA 10791 Minimum Sum LCM
摘要:题意:求几个最小公倍数为n的数的最小和1、每个素因子组成的最大数加,如:12=(2*2)+ 32、区分单个素因子16=(2*2*2*2)+13、素因子只有1和本身的7=1+7=8,即本身是素数。CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<ctype.h>usingnamespacestd;longlongn;longlongs
阅读全文
UVA 128 Software CRC
摘要:大意:判断一个256进制数增加2个字节(16位)是否可以被32493整除。说实话,真难看懂题意。CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<ctype.h>usingnamespacestd;#defineMAXN1050charstr[MAXN];intmain(){charsave[8];longlongres=0,ans
阅读全文
UVA 10006 Carmichael Numbers
摘要:大意:判断是否是一个特定的数字。思路:按照题目的要求写就行,枚举+判断是否是素数。CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>usingnamespacestd;#defineMAXN65100intvis[MAXN]={0};intprime[MAXN]={0};intn,tot;voidinit(){tot=0;intSIZE=(int)sqrt(MA
阅读全文
poj 3714 Raid
摘要:大意:给你一些加油站A的坐标,一些需要基地B的坐标,问你这两者之间的最小值。思路:用一个标记来表示分别在A和B中,数组长度变大了两倍,然后就是最近点对模板题啦。另外:输出是%.3f,我用%.3lf就WA。CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>usingnamespacestd;#defineMAXN100010constintINF=1e50;str
阅读全文
Hdu 1007 Quoit Design
摘要:大意:广场上固定着一些玩具,让你设计一个圆环使得最多只有一个玩具落入环中。(使得圆环具有最大半径)思路:去寻找最近的一个对点,它们之间的距离/2就是圆环的最大半径。最近点对模板题.CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>usingnamespacestd;#defineMAXN100010structnode{doublex,y;}p[MAXN*2],
阅读全文
UVA 10245 The Closest Pair Problem
摘要:最近点对模板题,算法导论P591有具体的证明,我不会实现 - -!,有一个博主写的很好,具体的证明可以见博客:http://blog.csdn.net/zhang20072844/article/details/6776386#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>usingnamespacestd;#defineMAXN100010structnode{dou
阅读全文
UVA 10602 Editor Nottoobad
摘要:大意:一台机器可以使用2种命令,即复制最后一个单词,将最后一个单词的最后一个字母删去,问你使用最少打印的字母打印所有的字符串。思路:每次枚举出于前一个字符串具有最长长度的公共前缀,贪心性质可以被证明,直到所有的字符串都被包括。CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>usingnamespacestd;#defineMAXN1001charstr[MAXN][MAXN];intsave[MAXN],n;
阅读全文
UVA 10718 Bit Mask
摘要:大意:给你一个数字N,L,R,求数字M(L<=M<=R)使得N|M的值最大。思路:将数字用二进制表示,从高到低枚举32位,采用贪心的思想。CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>usingnamespacestd;#defineMAXN1001longlongten2b[MAXN];longlongMbit[MAXN];longlongtot;voidchange(longlongn){w
阅读全文
UVA 993 Product of digits
摘要:大意:给你一个数字A,让你求最小的数字使得该数字各个数字的积为A。思路:觉得是一道数论题,只要让A的因子从小到大产生,DFS可以过,其余的不知道。1、首位是不能为1的,1x任何数等于任何数,而且又使数字增加了10倍,不是最小的。2、枚举A因子的总数。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>usingnamespacestd;#defineMAXN110intfac[MAXN],num[MAXN];intn,tot;intflag;voidin
阅读全文
UVA 10714 Ants
摘要:大意:给你一段水平的距离,以及蚂蚁相对于最左边的距离,蚂蚁行走的方向不确定,一旦所有的蚂蚁都走出了这一段水平距离的话,让你求出可能的最小与最大时间。思路:最小时间非常好求,主要的问题是求最大的时间,我们可以将问题转换为等价问题,即蚂蚁碰到之后然后反方向行走相当于一直前进,这个问题可以手写模拟一遍,发现行走的距离总是相等的。问题衍生一下,如果有的蚂蚁的速度是1cm/s,而有的蚂蚁是2cm/s呢?那怎么去求?我想这个问题应该按照dis/v来比较大小了吧。CODE:#include<cstdio>#include<cstdlib>#include<iostream>
阅读全文
UVA 10057 A mid-summer night's dream.
摘要:大意:给定一串(|X1-A| + |X2-A| + … … + |Xn-A|) ,让你求一个值A使得此表达式最小。思路:见附件,从概率的角度证明了这个数一定是中位数,如果n是奇数,A一定只有一个,否则可以取a[q],a[q+1]闭区间之间的任何数。关于中位数定理的一个概率证明(点击下载附件)CODE:#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;#defineMAXN100
阅读全文
POJ 1505 Copying Books
摘要:题意:按顺序给你N个数,将这N个数分成连续的M段,使得这M段每段的和中的最大值最小,输出最小值(1<=N<=100000,1<=M<=N,每个数在1到10000之间),如果有多种可能的话,尽量在前面进行划分。思路:1、由于函数具有单调性的特征,因此可以用二分枚举的办法去实现它,这与POJ3258有非常相似的地方,但这里不需要排序。2、输出的时候需要用到贪心的思想,既尽量往前划分。3、大概的思路就是二分枚举求得满足题意的最大值之后,然后以这个最大值通过从后往前的方式划分成段,如果剩余可划分段与i+1的值相等(尽量靠前),则将剩余的段往前划分,具体实现可以用一个标记数组us
阅读全文
UVA 714 Copying Books
摘要:题意:按顺序给你N个数,将这N个数分成连续的M段,使得这M段每段的和中的最大值最小,输出最小值(1<=N<=100000,1<=M<=N,每个数在1到10000之间),如果有多种可能的话,尽量在前面进行划分。思路:1、由于函数具有单调性的特征,因此可以用二分枚举的办法去实现它,这与POJ3258有非常相似的地方,但这里不需要排序。2、输出的时候需要用到贪心的思想,既尽量往前划分。3、大概的思路就是二分枚举求得满足题意的最大值之后,然后以这个最大值通过从后往前的方式划分成段,如果剩余可划分段与i+1的值相等(尽量靠前),则将剩余的段往前划分,具体实现可以用一个标记数组us
阅读全文
UVA 10700 Camel trading
摘要:手推可以得到一定是先+后x的积最大,反之最小,然后模拟一遍即可,我的代码比较cuo,于是借鉴了别人用栈模拟优先级的代码,模仿才有创新。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>#include<stack>usingnamespacestd;stack<longlong>Max;stack<longlong>Min;v
阅读全文
UVA 10954 Add All
摘要:大意:让你按照某一顺序使得给定的数字的和最小。思路:贪心性质可以被证明,见刘汝佳白书P156,可以用哈夫曼树来做,我用的是优先队列。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>usingnamespacestd;#defineMAXN5010intn;inta[MAXN],sum[MAXN];structcmp{booloperator()(constin
阅读全文
UVA 10020 Minimal coverage
摘要:大意:数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[s,t]。思路:贪心,具体见刘汝佳白书P154。把各区间按照a从小到大排序。如果区间1的起点不是s,无解,否则选择起点在s的最长区间。选择此区间[ai,bi]后,新的起点设置为bi,然后经过依次扫描之后就可以得出最小的线段数。并用另一个结构体储存路径。另外:排序可有可无,有了只不过是一种优化措施,没有排序的话程序也对,最主要的算法还是贪心。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<algo
阅读全文
UVA 311 Packets
摘要:贪心,用到了许多小技巧,向下取整等。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>usingnamespacestd;intu[4]={0,5,3,1};//以三的剩余个数进行分类intmain(){intone,two,three,four,five,six;while(scanf("%d%d%d%d%d%d",&one,&two,&three,&four,&five,&six)
阅读全文
UVA 10026 Shoemaker's Problem
摘要:大意:鞋匠接收了许多订单,有些鞋子有一定的修理期限,超过了这个期限就会罚款,让你求出最少赔款的方案,如果有多个相同的,请按输入的顺序从小到大输出。思路:可以证明是简单的贪心,即时间越早,而罚款数越大则越先修。按照fine/cost排序即可。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;#defineMAXN1001stru
阅读全文
UVA 10706 Number Sequence
摘要:题意:给出一串那样的数字,很有规律的,总共有2147483647位,然后问你第 n 位上的数字是多少。思路:具体做法是用两个数组保存上面的数据。1、[] 数组表示前面所有段的位数,a[i]表示前i段一共有多少位。2、保存那一段具体的位数,b[]数组存储的是序列12345678910111213…各位位数对应数组的值,即b[1]=1, b[2]=2, b[3]=3, b[4]=4, b[5]=5, b[6]=6, b[7]=7, b[8]=8, b[9]=9, b[10]=1,b[11]=0, b[12]=1,b[13]=1, b[14]=1,b[15]=1, b[16]=1,b[17]=2,
阅读全文
UVA 270 Lining Up
摘要:大意:判断最多有多少点在同一直线上。思路:可以通过枚举所有点加判断三点共线去解决,即(y2-x1) /(x2-x1) = (y3-y1)/(x3-x1);注意输入格式比较特别。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#include<map>usingnamespacestd;#defineMAXN10001intx[MAXN],y[MAX
阅读全文
UVA 10340 All in All
摘要:CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#include<map>usingnamespacestd;#defineMAXN10000001map<string,int>Map;charsz1[MAXN],sz2[MAXN];voidKMP(intlen1,intlen2){inti=0,j=0;while(i<len1)
阅读全文
UVA 10487 Closest Sum
摘要:CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>usingnamespacestd;#defineMAXN1000001#defineINF0x3f3f3f3finta[MAXN],sum[MAXN*10];intn,m,tot;voidinit(){tot=0;memset(sum,0,sizeof(sum));memset(a,0,sizeof(a));}
阅读全文
UVA 10341 Solve It
摘要:大意:给你一方程,让你求零点。思路:对函数求导,知道它是单调递减的。由于保留4位小数,可以通过二分枚举大于1e-9的方法求零点而不会无限循环。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>usingnamespacestd;#defineeps1e-9doublep,q,r,s,t,u;doublef(doublex){returnp*exp(-x)+q*s
阅读全文
UVA 10763 Foreign Exchange
摘要:CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<algorithm>usingnamespacestd;#defineMAXN500001intmain(){intn;while(scanf("%d",&n)&&n){for(inti=0;i<n;i++){scanf("%d%d",&a[i],&b[i]);}sort(a,a+n),s
阅读全文
UVA 10905 Children's Game
摘要:技巧挺强的。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<algorithm>usingnamespacestd;#defineMAXN51intcmp(stringa,stringb){if(a+b>b+a)return1;return0;}//string已经重载了<>=运算符stringstr[MAXN];intmain(){intn;while(scanf("%d",&am
阅读全文
Hdu 2500 做一个正气的杭电人
摘要:CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>usingnamespacestd;charstr[10]="HDU";intmain(){intn;intT;scanf("%d",&T);while(T--){scanf("%d",&n);for(inti=0;i<3*n;i++){for(intj=0;j<n;j++){printf("%s"
阅读全文
UVA 216 Getting in Line
摘要:大意:给你一些定点,让你以代价最小的边将所有的点连起来。思路:数据范围很小,可以通过最小生成树或者回溯来解决。最小生成树去写时不知道哪错了,于是用回溯模拟了一遍,相当于模拟一个数组的全排列。AC CODE:#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<climits>//INT_MAX,整形范围内的最大整数。#include<algorithm>usingnamespacestd;#defineINF0x3f3f3f3fc
阅读全文
UVA 331 Mapping the Swaps
摘要:大意;求在最小的交换次数的情况下使得序列升序排列的方案数。思路:冒泡排序对应最小交换数,然后回溯。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>usingnamespacestd;intans;intn;inta[1001];intcheck(int*a){for(inti=0;i<n-1;i++){if(a[i]>a[i+1])return0;}return1;}voidswap(int&a,int&b){intt=a
阅读全文
hdu 1043 Eight
摘要:BFS+hash判重。CODE:(TLE)#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<queue>#include<set>usingnamespacestd;typedefintState[9];constintMAXN=1000003;constintdx[]={-1,1,0,0};constintdy[]={0,0,-1,1};chardir[5]="udlr";intgoal[9]={1
阅读全文
UVA 10085 The most distant state
摘要:大意:八数码问题的变形,让你求离当前状态最远的距离。思路:BFS + hash判重,直到不能扩展为止,最后一个节点一定是最远的距离(由BFS性质知道)CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<queue>#include<set>usingnamespacestd;typedefintState[9];constintMAXN=1000003;constintdx[]={-1,1,0,0};consti
阅读全文
UVA 10422 Knights in FEN
摘要:隐式图的遍历。大意:在5X5方格中,给你一定的棋子,让你判断找出最小的步数变成给定的状态。思路:BFS+hash判重模拟过程。1、通过STL重载来实现hashstruct cmp{ bool operator () (int a, int b) const { return memcpy(a.map, b.map, 25) < 0;}};2、hash判重,注意状态转移。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<qu
阅读全文
UVA 539 The Settlers of Catan
摘要:CODE:#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>usingnamespacestd;#defineMAXN30#defineINF0X3F3F3F3FintG[MAXN][MAXN];boolvis[MAXN][MAXN];intans,n,m;voidinit(){memset(G,0,sizeof(G));ans=-INF;}voiddfs(intu,intcur){if(cur>ans)ans=cur;for(intv=0;v<n;
阅读全文
UVA 10474 Where is the Marble?
摘要:大意:排序,求数字第一次出现的位置。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>usingnamespacestd;intn,m;inta[10001];intcmp(constvoid*a,constvoid*b){return*(int*)a-*(int*)b;}intmain(){inttimes=0;while(~scanf("%d%d",&n,&m)&&(n||m)){for(inti
阅读全文
UVA 10591 Happy Number
摘要:CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<set>usingnamespacestd;set<int>vis;voidinit(){vis.clear();}intgetNumber(intn){ints=0;while(n){s+=(n%10)*(n%10);n/=10;}returns;}intmain(){inttimes=0;intT,ans,n;scanf("%d",&am
阅读全文
UVA 639 Don't Get Rooked
摘要:简单回溯CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>usingnamespacestd;constintSIZE=6;intMAX;intmaze[SIZE][SIZE];intN;intcheck(intr,intc){inti;for(i=r-1;i>=0;i--){if(maze[i][c]=='Y')return0;if(maze[i][c]=='X')bre
阅读全文
UVA 10603 Fill
摘要:大意:隐式图的遍历。思路:通过BFS模拟倒水的过程。1、当前容器不为空且被倒容器还有剩余的体积。2、通过3维数组来判重。3、由于求的是最小的倒水量,如果最小量不存在则求最接近于要求倒水量的d,于是我们可以通过从大到小枚举每一个d值来求。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<queue>usingnamespacestd;#defineMAXN210constintINF=0x3f3f3f3f;structnod
阅读全文
UVA 167 The Sultan's Successors
摘要:CODE:#include<cstdio>#include<cstring>#include<iostream>usingnamespacestd;#defineMAXN8intG[MAXN][MAXN];intA[MAXN];boolvis[3][MAXN*2];intans;voiddfs(intn,intcur=0){if(cur==n){inttot=0;for(inti=0;i<n;i++)tot+=G[i][A[i]];if(tot>ans)ans=tot;}elsefor(inti=0;i<8;i++){A[cur]=i;if
阅读全文
UVA 10004 Bicoloring
摘要:题目大意:二染色。条件:1、不存在环2、图是连通图3、双向图思路:任意取一个点进行染色,如果发现要涂某一块时这个块已经被涂了色,并且与我们要使用的颜色不同的话,就说明这个图不能被染成BICOLORABLE的。(1)如果没有染色,将它染色,并将它周围的点变成相反色。(2)如果已经染色,判断是否与现在染色的点的颜色相同,相同,则退出,否则继续。CODE:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#defineMAXN102usingnamespacest
阅读全文
UVA 208 Firetruck
摘要:直接回溯会超时,所以我们需要预处理一下,把所有与终点相连的点处理出来。CODE:#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<algorithm>usingnamespacestd;#defineMAXN30vector<int>G[MAXN];boolvis[MAXN];intdist;intfa[MAXN];intflag[MAXN];inttot;voidinit_dfs(intu)//反向预处理{flag[u]
阅读全文
UVA 11218 KTV
摘要:好久没写题了CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>usingnamespacestd;constintM=82;intr[M][4];intv[M];intn,tot;intflag;voiddfs(intcur,intans){if(cur==3){tot=max(ans,tot);}for(inti=0;i<n;i++){if(!v[r[i][0]]&&!v[r[i][1]]&&!v[r[i][2]
阅读全文
浙公网安备 33010602011771号