随笔分类 - ACM
HDU解题报告
摘要:函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *strcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) { char string[1
阅读全文
posted @ 2016-04-04 18:29
龙杉老师
摘要:1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecm
阅读全文
posted @ 2016-04-04 18:20
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1053认真读题,别怕题长,此题考查的就是哈夫曼树并求出最小编码值,注意每一次要将数组清0,否则会出错!AC代码:#include<iostream>#include<string.h>using namespace std;#define M 1000000struct node{ int l,r,data,p;}ha[100];int main(){ //freopen("d:\\1.txt","r",stdin); char s[1
阅读全文
posted @ 2012-05-05 11:15
龙杉老师
摘要:本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2527此题考查的是哈夫曼树,构造哈夫曼树并计算出最小编码数即可。做此题的过程中,提交之后竟然TLE,很是郁闷,找了几遍,还是没找出错误,可以肯定算法是不会错的,这方面不会超时,当测试只有一个字符的时候,发现问题了,出现了死循环,因为当只有1个或一种相同的字符的时候,并没有进行构造哈弗曼数的过程,因此在下面的找最小编码数的时候,出现了死循环,这个地方需要特殊计算最小编码数。改过之后,立刻就AC了,真是感慨,不过还挺满意的,自己构造出了哈夫曼树,继续加油!\(^o^)/~AC代码如下:#include&
阅读全文
posted @ 2012-05-05 00:30
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134此题考查的是卡特兰数,由于卡特兰数很大,所以考虑大数处理。卡特兰数的前几项为:h(0)=1;h(1)=1;h(2)=2;h(3)=5……卡特兰数的递推公式为:h(n)=h(n-1)*(4*n-2)/(n+1);非递推公式为C(2n,n)/(n+1);此题用递推公式求解,并用到大数的乘法和大数的乘法处理,本题对卡特兰数的前100项做了预处理:AC代码如下:#include<iostream> //卡特兰数求法 递推公式h(n)=h(n-1)*(4*n-2)/(n-1)using na
阅读全文
posted @ 2012-05-03 22:26
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431此题可先求10^8以内的最大回文素数,大概用时250秒- -,求得最大回文素数为:9989899,代码如下:// Note:Your choice is C++ IDE#include <iostream>using namespace std;#include<time.h>#include<math.h>int is_p(int n){ int i,m; m=(int)(sqrt(n*1.0)); for(i=2;i<=m;i++) if(n%i=
阅读全文
posted @ 2012-05-03 16:46
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215由于此题的测试数据可能有500000个,就想到用预处理法把结果都算出来存到数组中,然而将会超时,可能原因是其测试数据没有500000组,所以不一定都得用预处理法处理。用筛选法处理也会超时。因此可以考虑直接求解,其中一定要先开根号得出结果,在带入循环条件,否则会超时。预处理代码:超时#include<iostream>using namespace std;#include<time.h>#include<math.h>int a[500005]={0};vo
阅读全文
posted @ 2012-05-03 14:25
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1262用筛选法求稍微方便一些:#include<iostream>using namespace std;#include<math.h>#define M 10005int a[M+1]={1,1};void is_prime() //预处理{ int m=(int)(sqrt(M*1.0)); for(int i=2;i<=m;i++) if(a[i]==0) for(int j=i*i;j<=M;j+=i) a[j]=1; }int main(){ ...
阅读全文
posted @ 2012-05-02 17:14
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2054此题卡数据,卡爆所有数据,例如下面数据包括其他的都得成立:0012. 12..25 .25000. . 12.1000001 0012.1000001000001200 0001200012. 012.0000.025 0000.02500000000000000000000000000000000.0 0..0 .000000000000000000000000000001 1.0000000000000000000000005. 05.00000000000000第一次提交居然WA,实在无
阅读全文
posted @ 2012-04-30 19:09
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2093本题即为字符串处理以及sscanf函数以及排序的应用.sscanf函数的应用对此题有了很大帮助,方便快捷的得到字符串中的整形数据。要先对姓名按字典排序,以应对AC的题数和罚时都相同的情况。AC代码:#include<iostream>using namespace std;#include<string.h>char s[1000][15]={0};int A[1000]={0},B[1000]={0};int main(){ //freopen("d:\\1
阅读全文
posted @ 2012-04-30 11:23
龙杉老师
摘要:有一块椭圆的地,你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段。它们最多能把土地分成多少个部分?解:最优方案是不让三条线段交与1点。欧拉公式:V-E+F=2.其中V是顶点(即所有线段的断点数加上交点数),E是边数(即n段椭圆弧加上这些线段被切成的段数),F是面数(即土地块数加上椭圆外那个无穷大的面)。换句话说,只需求出V和E,答案就是E-V+1;不管是定点还是边,计算时都要枚举一条从固定点出发(所以最后要乘以n)的所有对角线。假设该对角线左边有i个点,右边有n-2-i个点,则左右两边的点两两搭配后在这条对角线上形成了i*(n-2-i)个焦点,得到了i*(n-2-i)+1条线段。注
阅读全文
posted @ 2012-04-29 13:26
龙杉老师
摘要:果园里的树排列成矩阵。他们的x和y的坐标均是1~99的整数。输入若干个三角形,依次统计每个三角形内部和边界上共有多少棵树。输入:1.5 1.5 1.5 6.8 6.8 1.510.7 6.9 8.5 1.5 14.5 1.5此题用三角形有向面积来解,求有向面积2倍的函数为:double area(double x0,double y0,double x1,double y1,double x2,double,y2){ return x0*y1+x2*y0+x1*y2-x0*y2-x1*y0-x2*y1;}若求其面积,即没有方向的:则为fabs(S)/2;可以用行列式来记...
阅读全文
posted @ 2012-04-29 13:03
龙杉老师
摘要:二分法数学的魅力:幂运算满足结合律n为偶数: a^n=a^(n/2)*a^(n/2);n为奇数: a^n=a^(n/2)*a^(n/2)*a;保存a^(n/2),很容易求出a^n; 大数取模(a*b)%m=(a%m*b%m )%m;求(2^100000000000000)%10000;提示:二分法,速度惊人的快速幂!!!此题一般的数代码如下:#include<iostream>using namespace std;#include<math.h>__int64 fun(__int64 m,__int64 n,__int64 k){ __int64 s; if(n==1
阅读全文
posted @ 2012-04-25 23:52
龙杉老师
摘要:所谓整数拆分即把整数分解成若干整数的和(相当于把n个无区别的球放到n个无标志的盒子,盒子允许空,也允许放多于一个球)。整数拆分成若干整数的和,办法不一,不同拆分法的总数叫做拆分数。母函数法求一个整数的拆分:#include <iostream> //母函数法求一个整数的划分using namespace std;int c2[1000],c1[1000];int main(){ int n; while(1) { cin>>n; int i,j,k; for(i=0;i<=n;i++) { c2[...
阅读全文
posted @ 2012-04-24 00:08
龙杉老师
摘要:分治分治法是将一个规模为n的问题分解为k个规模较小的子问题。注意:这里的子问题一定是相互独立且与原问题相同。用递归的方法解这些子问题。然后将各子问题的解合并到原问题的解。二分查找算法是运用分治的典型例子分治-二分查找给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。分析据此容易设计出二分搜索算法:在 a[0] <= a[1] <= ... <= a[n-1] 中搜索 x, 找到x时返回其在数组中的位置,否则返回-1int binarySearch(int a[], int x, int n){ int left = 0; int right =
阅读全文
posted @ 2012-04-23 23:15
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536只要构造好SG函数就行:AC代码:#include<iostream>using namespace std;#include<string.h>int a[110],k; //k为全局变量int sg[10010],flag[110];void SG() //SG函数{ int i,j; for(i=0;i<=10000;i++) { memset(flag,0,sizeof(flag)); for(j=0;j<k;j++) ...
阅读全文
posted @ 2012-04-21 23:49
龙杉老师
摘要:小于x且与x互素的正整数的个数如果x为素数,则欧拉函数等于x-1求法:将x分解为p1^n1*p2^n2*…pk^nk,则欧拉函数=x*(1-1/p1)*(1-1/p2)…*(1-1/pk);代码如下:#include<iostream>using namespace std;#include<string.h>#include<math.h>#define M 10000int p[M],a[M+1],p1[M];void prime(){ memset(a,0,sizeof(a)); int i,j,k=0,m; m=(int)(sqrt(M*1.0));
阅读全文
posted @ 2012-04-21 15:47
龙杉老师
摘要:已知n=p1^a1*p2^a2…*pk^ak,(也就是n的素数分解),求n的约数个数。分析:n的约数一定包含素因子中的某几项,对于n的某个素因子pi,它在约数中的指数可以是0,1,2…ai共ai+1种情况,根据乘法原理:n的约数个数=(a1+1)*(a2+1)…*(ak+1)自己写的代码如下:#include<iostream>//求n以内的公约数的个数using namespace std;#include<string.h>#include<math.h>#define M 10000int p[M],a[M+1],b[M],c[M];void prim
阅读全文
posted @ 2012-04-21 14:43
龙杉老师
摘要:^^^转载请注明出处~~~The Sprague-Grundy theory of impartial games公平游戏的Sprague-Grundy定理公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法操作对双方来说都是相同的。一个公平游戏可以抽象地用一个有向无环图来表示,这个图中每个点都对应这一个状态,每条有向边代表从一个状态到另一个状态的合法操作。我们可以想象一个代币最初放在某个点上,然后两个玩家轮流将其从当前的点移动到它的后继点。当代币移动到汇点时游戏结束,汇点是一个没有出度的点,最后一个需要操作的玩家就是胜者。P- 和 N-状态如果双方都按照最佳策略进行游
阅读全文
posted @ 2012-04-21 09:58
龙杉老师
摘要:甲乙两人面对若干排石子,其中每一排石子的数目可以任意确定。例如图所示的初始局面:共n=3排,其中第一排的石子数a1=7,第二排石子数a2=3,第三排石子数a3=3。两人轮流按下列规则取走一些石子,游戏的规则如下:每一步必须从某一排中取走两枚石子;这两枚石子必须是紧紧挨着的;如果谁无法按规则取子,谁就是输家。 解:用符号#S,表示局面S所对应的二进制数。用符号$(x),表示局面(x)的下一步所有可能出现的局面的集合。定义集合g(x):设$(x)={S1, S2, …, Sk},则g(x)={#S1, #S2, …, #Sk}。函数f满足要求的一个充分条件f(a1)不属于集合g...
阅读全文
posted @ 2012-04-20 20:06
龙杉老师