![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法竞赛题解
GejinZ
We are all Procrastinators. Just Take Action and Be Serious.
展开
-
poj 3270 置换的运用
1.找出初始状态和目标状态。明显,目标状态就是排序后的状态。2.画出置换群,在里面找循环。例如,数字是8 4 5 3 2 7,目标状态是2 3 4 5 7 8,能写为两个循环:(8 2 7)(4 3 5)。3.观察其中一个循环,明显地,要使交换代价最小,应该用循环里面最小的数字2,去与另外的两个数字,7与8交换。这样交换的代价是:sum - min + (len - 1) * min原创 2014-11-01 16:30:05 · 833 阅读 · 0 评论 -
poj 2409 polya定理
#include#include#include#includeusing namespace std;typedef long long LL;int gcd(int x,int y){ return y ? gcd(y,x%y) : x;}int main(){ int n,m; LL ans; while(scanf("%d%d",&m,原创 2014-11-01 14:36:39 · 777 阅读 · 0 评论 -
uva 10641 (来当雷锋的这回....)
#include#include#include#includeusing namespace std;const double eps = 1e-6;const int inf = 0x3f3f3f3f;int n,m;int f[100];struct point{ double x,y; point(double xx = 0,double yy = 0)原创 2014-10-20 20:37:21 · 1040 阅读 · 0 评论 -
poj 1143 number game
题目比较长,题意不大好理解现在把题意抽象一下,大概是以下意思:1.给2~20的数字中的几个数组成数组a,其中是你可以选择的数字;2.选择的规则如下:(1).如果选择了某个数字x,则数组a中是其倍数的数字将被划去;(2).假如数字n在数组a中,若n-x 的值并不在数组a中,则划去n;3.当没有数字可以选取时,则此player失败;4.让你找出先选的player选择哪个数字原创 2014-09-25 08:04:38 · 986 阅读 · 0 评论 -
hdu 3779 Railroad (动态规划)
RailroadTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 554 Accepted Submission(s): 223Problem DescriptionA train yard is a com原创 2014-09-18 17:04:23 · 1112 阅读 · 1 评论 -
uva 12086 - Potentiometers (树状数组)
就是树状数组的模板就可以,但是特别注意一点,树状数组中的C数组不清零,就会导致出错。#include#include#include#includeusing namespace std;const int maxn = 200010;int c[maxn];int a[maxn];int n;int lowbit(int x){ return x&(-x)原创 2014-09-08 15:16:55 · 826 阅读 · 0 评论 -
uva 11235 Frequent values(游程编码+区间最小值查询)
游程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“行程”。游程编码因此而得名),使符号长度少于原始数据的长度。只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。游程编码(Run Length Encoding , RLE)例如:5555557777733322221111111游程编码为:(5原创 2014-09-08 14:43:25 · 1000 阅读 · 0 评论 -
uva 10125 - Sumsets(a+b+c=d)
希望下次能马上想到a+b 、d-c 分开来算。然后保存其中一项的值,算出另一项来就查找该值是否存在。这种方法明显比三重循环省时。还有下面的方法:三重循环穷举a,b,d;然后二分穷举c;#include#include#includeusing namespace std;int a[1010],i,j,k,ans,f,n;int comp(int x,原创 2014-09-04 19:29:20 · 808 阅读 · 0 评论 -
uva 11762 Race to 1
记忆化搜索的方式计算f(x)#include#include#include#includeusing namespace std;#define mem(a) memset(a,0,sizeof(a))const int maxn = 1000005;int n;int primes[maxn],prime_cnt;int vis[maxn];int v[maxn];原创 2014-09-04 18:51:28 · 769 阅读 · 0 评论 -
uva 1330 City Game (最大子矩阵)
空白最多的最大子矩阵:#include#include#includeusing namespace std;const int maxn = 1005;int mat[maxn][maxn],up[maxn][maxn],left[maxn][maxn],right[maxn][maxn];int main(){ int t; scanf("%d",&t);原创 2014-09-04 16:17:10 · 881 阅读 · 0 评论 -
uva 12124 - Assemble
#include#include#include#include#include#include#includeusing namespace std;const int maxn = 1005;#define mem(a) memset(a,0,sizeof(a))struct peijian{ int p; int q;}g[maxn][maxn];m原创 2014-09-04 12:54:32 · 691 阅读 · 0 评论 -
uva 10048 - Audiophobia(floyd 的变形)
给出一个无向连通图以及边权,目的求从一个点到另一个点的路径中 边权最大值 最小的那条路径,输出的是该条路径的最大边权。因为是两点间路径问题,且数据量很小(只有100个) ,所以考虑使用floyd算法。但是要求的并不是传统 floyd 所求的 两点之间最短路 问题,但是通过理解floyd算法的原理,可以发现floyd的思想可以用来解决这种问题:对于任何一条至少包含两条边的路径i->j,一原创 2014-09-01 15:15:13 · 729 阅读 · 0 评论 -
uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)
也是简单的最小生成树算法不过添加了一些新的东西,需要对最小生成树算法 以及其中的 并查集的使用 有一些比较深入的理解。处理问题的方法也有些复杂#include#include#include#includeusing namespace std;const int maxn = 1005;struct point{ int x; int y;}pp[m原创 2014-08-30 15:37:28 · 1489 阅读 · 0 评论 -
uva 1395 - Slim Span poj 3522 Slim Span(最小生成树算法)
最近学习了一下 最小生成树 算法。所谓最小生成树算法,就是给出一个连通图g[ maxn ][ maxn ], 找出这个连通图的边权和最小的生成图(树)。可以实现这个目的的算法,我叫它最小生成树算法。kruskal算法就是我学到的一种实现这种功能的算法。对于kruskal算法的描述以及简单的证明在刘汝佳第二版上已经说得够明白本题就是求 最小生成树 里面的 最大边权和最小边权 相差最原创 2014-08-30 15:23:06 · 892 阅读 · 0 评论 -
uva 247 Calling Circles(Floyd 的简单应用)
最近在看图论的经典算法,先看的是求单源最短路的dijkstra,优化后的算法用了优先队列,看起来有点复杂。感觉 弗洛伊德(Floyd) 要比 迪克斯特拉(dijkstra) 更好理解一点,但是Floyd是三层循环,当然会慢很多。一旦数据开大就跪了吧。floyd可以用来求 两个 连通点间的最短路问题。同时可以得到边权的和,即最短路的长度。另外一个比较简单的应用,还可以用来判断原创 2014-08-30 15:01:22 · 1178 阅读 · 0 评论 -
uva 11971 - Polygon(连续概率问题)
看书书上讲的很明白了...#include#includelong long gcd(long long a,long long b){ return b==0?a:gcd(b,a%b);}int main(){ int t; scanf("%d",&t); int n,k; int kase=0; while(t--)原创 2014-08-14 17:43:41 · 637 阅读 · 0 评论 -
uva 11346 - Probability
简单题,画个图用函数线表示一下x*y原创 2014-08-14 16:52:49 · 644 阅读 · 0 评论 -
0813的个人赛中的 所有题目
ZOJ 3279 ants http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3279树状数组,你不学就永远不会;原创 2014-08-14 16:15:39 · 534 阅读 · 0 评论 -
uva 1638 Pole Arrangement (有多少种可能?)
d[i][j][k]表示让高度为1~i的杆子排成一行,从左边看能看到j个,从右边看能看到kge原创 2014-08-14 16:02:14 · 739 阅读 · 0 评论 -
POJ 2955 Brackets(计数问题吗呵呵)
我只能说这道题和上一道动态规划的问题真的是太像了,连方法也一模一样确实,计数也需要存状态,计数也是需要动规的。此时d【i】【j】表示的状态是s【i~j】的序列中有多少 不规则 的括号。#include#include#includeusing namespace std;int n;char s[105];int d[105][105];bool ma原创 2014-08-14 15:56:15 · 678 阅读 · 0 评论 -
uva 1626 Brackets Sequence ❀(动态规划)
状态表示方法:d[ i ][ j ]表示的是一条序列的开始和结束;状态定义:d[ i ][ j ]表示字串s[ i~j ] 需要添加的数量。#include#include#includeusing namespace std;int n;char s[105];int d[105][105];bool match(char ch1,char ch2){ if(原创 2014-08-14 15:49:14 · 1680 阅读 · 0 评论 -
1637 - Double Patience(状态转移+求成功概率)
用九元组表示当前状态,即每队牌剩的张数,状态总数为5^9=1953125.设d[ i ]表示状态i对应的成功概率,则根据全概率公式,d[ i ]为后继成功概率的平均值,按照动态规划的写法计算即可。这个动态规划我不会写,帅哥思路真的很清晰很好啊。但是学会还是很高兴的#include#include#include#includeusing namespace std;#de原创 2014-08-14 15:38:25 · 1117 阅读 · 2 评论 -
10288 - Coupons(赠券收集问题)(概率)
roblem FCouponsInput: standard inputOutput: standard outputTime Limit: 2 secondsMemory Limit: 32 MB Coupons in cereal boxes are numbered 1 to n, and a set of one of each is原创 2014-08-14 13:51:27 · 2427 阅读 · 0 评论 -
uva 12230 - Crossing Rivers(求数学期望)
利用了数学期望的线性性质:有线个随机变量之和的数学期望的关于每个随机变量的期望之和;由于过每条河的时间为L / V和3L / V的均匀分布,因此期望过河时间为2L / V.#include#include#includeusing namespace std;int n;double d;int main(){ int kase=0; while(scanf(原创 2014-08-14 10:40:52 · 799 阅读 · 0 评论 -
uva 580 - Critical Mass(递推法!)
我不大会推啊……原创 2014-08-12 20:50:58 · 691 阅读 · 0 评论 -
uva 11181 - Probability|Given
条件概率公式:P( A|B ) = P( AB ) / P( B )表示在事件B发生的前提下,事件A发生的概率;对本道题:设事件E:r个人买了东西;事件Ei:第i个人买了东西;则要求的是P( Ei | E );计算P( E ) 用全概率公式即可,采用递归枚举出所有r个人买东西的情况,然后计算出其总的概率;计算P( Ei ) 就是在上面递归枚举的过程中将选上第i个人的情况原创 2014-08-12 19:11:32 · 736 阅读 · 0 评论 -
uva 1636 - Headshot(简单概率问题)
直接扣一枪没有子弹 是条件概率 转一下再扣一枪 是简单事件发生的概率前者用00的个数除以00和01子串的总数后者用0的个数除以所有数字的个数然后换算一下运算方式比较即可#include#includeconst int maxn = 105;char s[105];int cnt0,cnt1,cnt2,cnt3;int main(){ while(scan原创 2014-08-12 17:14:55 · 1893 阅读 · 0 评论 -
uva 10820 - Send a Table(欧拉phi函数的应用)
本题的意思是:输入n,原创 2014-08-12 16:20:34 · 635 阅读 · 0 评论 -
uva 10791 Minimum Sum LCM ( 唯一分解定理 )
使用唯一分解定理的时候不一定要打出素数表,这句话是相对上一篇来讲的。做这道题目之前我对唯一分解定理方法的理解不完全。现在多想到了一些唯一分解,将当前需要分解的n用因子将其分解表达。需要试因子。因子的枚举应该是从2开始(从1开始没有意义),当当前数字n可以整除当前因子i时,就使其不断除以i,直到不能整除。这个步骤实际上已经在根本上避免了出现像4、6这种因子在唯一分解式中的出现——之前原创 2014-08-12 10:18:42 · 795 阅读 · 0 评论 -
uva 1335 Beijing Guards
巧妙之处在于当人数是奇数时,其选择方案是第一个人尽量靠左选,以后编号为偶数的人尽量靠左选,编号为奇数的人尽量靠右选。然后二分枚举可能的礼物数量,看最后是否满足题目要求——第一个人和最后一个人不选重。细节问题总结:重定义全局变量会导致错误,切不好检查出来,应谨慎。#include#include#includeusing namespace std;const int maxn原创 2014-08-12 09:16:45 · 822 阅读 · 0 评论 -
10375 - Choose and divide(唯一分解定理的运用 eratosthenes构造素数表)
我觉得数学类的题目,每一道都有很好的解决方法,都很有保存的意义和价值。这道题目里面,巧妙地运用了 唯一分解定理,辅以素数的eratosthenes筛法构造,很好地解决了题目。值得思考和深入的学习。#include#include#include#include#includeusing namespace std;vector primes;const int ma原创 2014-08-11 16:18:28 · 763 阅读 · 0 评论 -
11582 - Colossal Fibonacci Numbers!
f (0) = 0 and f (1) = 1f (i+2) = f (i+1) + f (i) for every i ≥ 0Sample inputthree integers a,b,n where 0 ≤ a,b 64 (a and b will not both be zero) and 1 ≤ n ≤ 1000.Ta b n原创 2014-08-11 10:59:18 · 947 阅读 · 0 评论 -
uva 10918 - Tri Tiling这是数学
[+]题意有一个3xn的矩形,装2x1的矩形,有多少种方案。思路显然,当n为奇数的时候不可能实现。考虑加入第n列的时候。如果把第n列和第n-1列孤立出来放矩形,可以放3种(这个不难数,这样f(n)=3∗f(n−2)但是加入第n列,n - 1和n - 2列也可以放矩形了(本来不可以如图所示所以目前f(n)=3f(n−转载 2014-08-08 12:59:57 · 782 阅读 · 0 评论 -
uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)
本题难处好像是在于 可以把一些灯泡换成电压更高的灯泡以节省电源的钱 ,所以也才有了对最优方案的探求好的处理方法是按照电压从小到大排序,只能让前面的换成后面的,也就满足了把一些灯泡换成电压更高的灯泡的要求;一种电压的灯泡,要么不换,要换则应该全换:换,说明用当前的电源不值;而既然不值则应该全部换掉以避免使用当前电源,不然即增加了灯泡费用又没节省电源费用,亏大了。。。状态转移详见代码原创 2014-08-07 17:22:41 · 1084 阅读 · 0 评论 -
uva 437 The Tower of Babylon(动态规划 嵌套矩形问题最长路)
有思路就去做,要相信自己多处理更复杂的情况,你就不觉得现在复杂了#include#include#includeusing namespace std;typedef long long ll;struct soli{ ll a,b,c;}s[40];int n;ll d[40][3];int vis[40][3];ll answer[40][3];ll原创 2014-08-07 16:39:44 · 1107 阅读 · 0 评论 -
uva 12563 - Jin Ge Jin Qu hao(动态规划~劲!歌!金!曲!)
错的我真是无语。。。还是状态的把握不准确。。起始状态转移方程是很重要,但是只推出了方程是不够的对边界状态的处理,对特殊状态的处理,这些都很重要,错了任何一个小地方,都会导致WA....细节!更清晰的思路,更全面的考虑!#include#include#includeusing namespace std;int n,t;int v[55];int d[55][1000原创 2014-08-07 16:29:00 · 1679 阅读 · 0 评论 -
uva 1347 - Tour
#include#include#include#include#includeusing namespace std;const int maxn = 1010;double d[maxn][maxn];int n;struct node{ double x,y;}a[maxn];double dist(int p1,int p2){ double原创 2014-08-07 16:24:38 · 1050 阅读 · 0 评论 -
uva 1625 - Color Length(dp 里面 L C S 问题解决方式变形)
LCS属线性结构上的动态规划,应该是动规里面很简单的一种类型。最长公共子序列问题,一旦明确了状态,找到状态转移方程还是很简单的。但是对于本题来说,难点之一就是会很难想到该如何定义状态。作为一只菜鸟,兹认为此题很复杂。首先我是想不到每一步都把没到终点的字母全加上1,以及这种效果与你去找开始和结束的效果是一样的。甚至,若不是在做动规的专题,我根本想不到这样的题目,会用动规来解决。再原创 2014-08-07 16:07:40 · 1733 阅读 · 0 评论 -
uva11464 - Even Parity
应该是属于暴力枚举类型的题目然后这个问题和开关灯的问题的解决办法很类似然后这两个题目我都没有什么解决办法……这种矩阵里面计数或者是寻求最少改变数字类型的题目,往往就U懵掉,只是去找规律去寻求自己所谓的正确的解法会计算,会找规律,会递推,会多加一次然后想到再除以2……总之等等等等方法可能都已经想过,在我的认知中却没有什么思路可以解题。也不是没有想到过逐一枚举,但是那要怎么枚举呢,原创 2014-08-05 09:23:27 · 730 阅读 · 0 评论 -
uva 116 - Unidirectional TSP (动态规划)
第一次做动规题目,以下均为个人理解以及个人方法,状态转移方程以及状态的定义也是根据个人理解,请过路大神指教。状态:每一列的每一个数[ i ][ j ]都是一个状态;然后定义状态[ i ][ j ]的指标函数d[ i ][ j ]为从[ i ][ j ]向右出发的可以得到的最小的整数和;状态转移方程:d[ i ][ j ]=min(d[ i+1 ][ j+1 ][ i-1 ][ j+1原创 2014-08-04 18:31:11 · 922 阅读 · 0 评论