算法
文章平均质量分 56
雅歌不会编代码
雅歌不会编代码
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
hdu1521
题意:中文题目我就不说了啊思路:其实这道题的思路就是先求组合,然后再求排列就可以了这道题的组合我是用母函数求的然后再乘k的阶乘就是答案了下面看代码:#include#include#include#includeusing namespace std;double a[15];void factorial(){ a[0] = a[1] = 1;原创 2015-05-22 18:36:15 · 529 阅读 · 0 评论 -
hdu2147
题目大意:就是有一个游戏,在一个n*m的矩阵中起始位置是(1,m),走到终止位置(n,1);游戏规则是只能向左,向下,左下方向走,想走到终点的为获胜者。思路:这道题我们可以用组合博弈的方法去做,把每个点是P还是N求出来 然后去比较 这样做也是可以的,如果你画了几个图你会发现当n和m中有一个是偶数的时候是一个人胜那么我们就可以写出来简易代码:#includeint main原创 2015-04-16 19:54:28 · 1224 阅读 · 0 评论 -
hdu1907 ,2509
题意:给你N堆石子最后取完的为输的问你谁能赢。思路:可以看出来这是nim游戏的变形,在我的博客中写过了nim游戏变形的解法,当为s0和t2态的时候为必输态s1,s2,t2为必赢态所以我们只需求出来充裕堆和孤单堆的个数就可以了下面看代码:#include#includeint a[5000];int main(){ int sum1,sum2,ans,t,n; //s原创 2015-04-16 19:43:29 · 606 阅读 · 0 评论 -
hdu1850
题意:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i=1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任意张牌;桌子上的扑克全部取光,则游戏结束;最后一次取牌的人为胜者。问如果先手想赢有多少种取法.思路::这道题类似于问你有多少种方法能把这几个数的异或变成0。我们知道如果异或不为0的时候我们只要用一堆的数减去异或的结果就可以了 ,但是如果这个堆的数如果小于异或的结果就不原创 2015-04-16 19:35:36 · 861 阅读 · 0 评论 -
个人总结的博弈知识
在古代的时候有一种很有意思的游戏 ,有若干堆东西 ,两个人按一定的规则去取,不同的玩法有不同的输赢方式,有的以最后取完的人为胜利者,有的以最后取完的为输的人。现在让我们来看三种博弈一.组合博奕: 有一堆东西,两个人按规则取一定的数量,最后取完的为胜利者。先设任务a先取人物b后取,规定P点为a的必败点,N为a的必胜点,我们可以知道0点一定是P,能达到0点的一定是N当所有操作都能到达N原创 2015-04-16 19:14:53 · 760 阅读 · 0 评论 -
最长回文子串算法入门经典
#include#include#include#include#include#define MAXN 5000 + 10char buf[MAXN],s[MAXN];int p[MAXN];int main(){ int n,m = 0,max = 0,x,y; int i,j; fgets(buf,sizeof(s),stdin); n转载 2015-04-15 20:27:17 · 602 阅读 · 0 评论 -
安慰奶牛
题目连接:http://lx.lanqiao.org/problem.page?gpid=T16思路:这就是一道简单的最小生成树的问题可是我们要注意的是 当我们去了一个地方我们要走回来的所以我们要把两个点的距离乘2然后求出最小的那个用时最短的牧场过夜 加上去就可以了 下面看代码:#include#include#include#includeusing name翻译 2015-04-15 20:11:03 · 560 阅读 · 0 评论 -
节点选择
题意:有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?这道题真是闹心了很久啊 然后还是在网上找了一个代码 然后还看了一晚上才看懂的dfs真是庞大啊下面看思路吧:我们用dp[i][0]表示没用i这个点的的最大值 然后用dp[i][1]表示用这个点的最大值然后dp[i][0] += dp原创 2015-04-15 19:31:16 · 989 阅读 · 0 评论 -
k好数
题意:如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。输入包含两个正整数,K和L。输出一个整数,表示答案对1000000007取模后的值。思路:原创 2015-04-15 19:26:01 · 1408 阅读 · 0 评论 -
最大最小公倍数
#include#include#includeint maxx(int x,int y){ if(x >= y) return x; else return y;}int main(){ long long n; scanf("%I64d",&n); if(n <= 2) { pr原创 2015-04-15 19:12:00 · 495 阅读 · 0 评论 -
贪心的几个经典题型
1. 选择不想交区间问题设点为(ai,bi)这样的题我们首先需要初始化 先把bi按从小到大的顺序排序然后就可以分成两种情况① a1 > a2那么区间2就包含了区间1如果选了区间2肯定是不合适的 所有这样的情况我们只能选区间1② a1 但是如果区间2和区间1有相交的部分那么我们一定选区间1 因为区间二的b比区间1的大 对后面的区间的影响可能大一些2.原创 2014-12-02 09:49:08 · 595 阅读 · 0 评论 -
hdu1536 1848
题意:两个题的题意基本上是一样的,英文不好就不说了啊。。。思路:其实这两道题就是求sg值得问题把每个堆的sg值求出来然后去异或就能知道是L还是W了这两道题我用了两种方法去求sg值一个是普通的方法一个是dfs求sg值dfs求sg值要注意几点一定要把堆排序 然后一定要把sg[]这个数组初始化而且只初始化一次下面看代码:1536:#include#include#incl原创 2015-04-16 20:06:49 · 578 阅读 · 0 评论 -
hdu2149
题意:题意是中文的大家自己读吧。。。思路:这道题明显是一道巴什博奕的题,我们得先求出来P和N必胜点和必败点,然后去看如果n是必胜点那么我们就看离他最近的必败点的距离就可以知道有多少种情况了然后如果成本价小于加价的时候就要特殊考虑了下面看代码:#include#include#includeusing namespace std;int main(){ int原创 2015-04-16 20:12:47 · 702 阅读 · 0 评论 -
poj1695
题意:给你一列数,然后问你这列数是不是可图的,这道题需要用到Havel-Hakimi定理的方法来构图我先说一下这个定理:1.先把这列数排序2.把这列数第一个数后面的没个数都-1。3,删除第一个数,然后在排序重复步骤二直到出现负数为止,如果出现负数说明是不可图的,如果出现都是0了 那就是可图的举个例子:序列S:7,7,4,3,3,3,2,1 删除序列S的首项 7 ,对其原创 2015-05-22 18:24:12 · 575 阅读 · 0 评论 -
poj1014
题意:就是从1到6给你每个数有几个,然后问你这些数能平均分给 两个人么刚看到这个题,直接背包 这就是背包九讲中说的多重背包,但是我用母函数解决起来也非常快,思路就是看看中间值系数是否为0就可以了下面看代码:#include#include#include#includeusing namespace std;int c1[200005],c2[200005];原创 2015-05-22 18:14:16 · 619 阅读 · 0 评论 -
poj 1942
题意:就是从一个角到另一个角有多少种走法刚看到这道题有点懵啊 无从下手,后来才知道用排列组合做这道题如果细看的话,我们知道我们需要m+n步 那我们就选n步走下也就是Cm+n/n 也就是这道题的答案了下面看代码:有两个地方需要注意我已经在程序中说明了#include#include#include#includeusing namespace std;uns原创 2015-05-20 20:19:16 · 696 阅读 · 0 评论 -
poj 1019
题意:给你一列数,然后问你这列数中的第几个数是什么11212312341234512345612345671234567812345678912345678910123456789101112345678910这道题啊 刚开始的时候忘记考虑两位数算两个数字三位数算三个数字了,但是我们怎么判断三位数是三个数字呢我也是在网上看到一个公式log10(n) +1 就是n的位数占几原创 2015-05-20 20:04:13 · 556 阅读 · 0 评论 -
poj 1850
题意:这个题就是给你一个序列a,b,c,d,e,f.............z,ab,.........az,bc,......vwxyz 1,2,3,4,5,6 26,27...... 51,52 83681然后给你一个序列问你这个序列是第几个序列下面原创 2015-05-19 18:12:18 · 602 阅读 · 0 评论 -
poj 2084
题意:其实说白了就是求卡特兰数不过这个数据很大要用到大数思路:我先说一下卡特兰数吧有一个求卡特兰数的公式:h(n)=h(n-1)*(4*n-2)/(n+1);这个公式应该记住的然后我在说一下大数的乘法和除法:void multiply(int *a,int MAX,int b) //大数乘法{ int i,array = 0; for(i = MAX -原创 2015-05-18 19:59:40 · 505 阅读 · 0 评论 -
hdu2159
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2159中文题 题意我就不说了思路:一看就是一道背包的题目 还可以肯定的是一道多重背包的题目下面看代码:#include#include#include#include//const int MAXN = 0x7ffffff;int dp[105][105];int ex[1原创 2015-05-18 19:21:27 · 562 阅读 · 0 评论 -
hdu4310
我先说一下题意吧:就是对面有很多对手 你每次可以打掉一滴血 然后给你了每个对手的血量 和每回合能攻击多少血 然后让你求出你最少消耗的血量思路:这道题我最初的思路就是把每个人的攻击力排序 然后依次杀掉攻击力重大到小的对手。交了一万次啊 还是不对 最后问了大神才知道要用攻击力和血量的比值来排序 你们可以自己在纸上推一下 这里我就不写为什么了下面看代码#includ原创 2015-05-18 18:29:35 · 665 阅读 · 0 评论 -
hdu1404
题意:给一个六位数,两个人轮流修改这个六位数,你可以将其中的一位改成比他小的任何一个数,当这位为0的时候他的右边就可以删除掉,最后一个把这个六位数删除的为赢家。思路:我们定义一个数组sg[]来存储这个数是否是必胜点,如果为必胜点为1,必败点为0.由题意我们可以知道,1这个点为必败点,那么可以到达1这个点的都是必胜点,可以到达1的有2,3,4,5,6,7,8,9 还有10**** 星号代原创 2015-04-16 22:40:02 · 888 阅读 · 0 评论 -
hdu1097
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1079这有事一道找规律的题,我们可以看出来不管怎么变换他们的奇偶都是会变的,出了9.30和11.30那么我们就把他们两个特殊考虑就是了11.4是奇数态那么偶数态一定是赢的所以只要判断给的是奇数态还是偶数态就行了下面看代码:#include#includeint main(){原创 2015-04-16 20:19:46 · 695 阅读 · 0 评论 -
hdu1847
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1847思路:这道题本来不想写的 ,不过不是纯纯的博弈是一道找规律的题,不过这个规律需要用博弈去找,如果你写了很多组数据你会发现如果n对3去模如果为0那么一定会赢下面看代码吧:#include#includeint a[12];int main(){ int n;原创 2015-04-16 20:14:38 · 584 阅读 · 0 评论 -
hdu1548
题意:一个人要从某一层电梯到另一层电梯 ,每层电梯都只能上或者下特定层数,问你从某一层到另一层最少需要按多少次电梯按钮如果你看了数据范围的话你就会想到用BFS广搜用广搜就会想到队列 我先说说队列的几个基本语句吧includequequeq入队q.push(x)将x接到对位q.pop(x)弹出队列的第一个元素q.front(x)访问数组的第一个元素q.back(原创 2015-05-18 18:47:28 · 1547 阅读 · 0 评论
分享