C
文章平均质量分 60
ZXLS-ZMR
我喜欢编程喜欢学习新的知识
展开
-
poj 2115-扩展欧几里得。
题目连接获得详细分析:点击打开链接贴个代码:#includetypedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y){ if(b==0){ x=1; y=0; return a; } LL d=exgcd(b,a%b,x,y); LL tmp=x; x=y; y=tmp-a/b*y; return d;}原创 2013-07-16 08:23:19 · 658 阅读 · 0 评论 -
HDU-2795 Billboard (线段树)RE的教训!
题目连接搞了两天的线段树,我一直在犯一个错误,代码看似没错提交总是RE!,心中的迷惑不解,连续做了几道题,都这样,我彻底无语了,搞的我没心情去涮题了。这题也不列外,提交总是RE,感觉自己数组开的完全没问题,在网上搜了很久,以为和我写得差不多的代码竟可以AC!为何?,我试着把他的代码改一改,就在我改了全局变量mid后时候。提交终于出问题了。心中迷惑豁然已解!,原来是全局变量mid若的祸!原创 2013-07-30 15:19:00 · 1147 阅读 · 0 评论 -
HDU -1754线段树
一道经典线段树入门题:query: 区间最大,Update: 单点更新;#include#define M 220000struct node{ int l,r; int val;}tree[M*4];inline int max(int a,int b){ //为了提高运行速度,加内置函数,另外,除法用移位代替。 return a>b?a:b;原创 2013-07-30 15:12:57 · 826 阅读 · 0 评论 -
DFS-变形课
这道题类似成语接龙。题意懂了,方法很简单,就是从开头是”b“的字母寻找下去,并判断最后一个字母是否为'm'如果找的到就退去,很明显就是个递归(DFS)就可以实现了。#include#includechar a[100][20];int visit[100];int flag ,n;void DFS(int x){ int k=strlen(a[x]); c原创 2013-03-31 23:03:15 · 860 阅读 · 0 评论 -
HDU-1262素数对
水题一个:先打印素数表,然后去中,往两边一次选,就可以了,主意可以认为相同的两个素之和等于偶数,比如34=17+17。先前没注意这个WA。#include#includeint p[10010]; void get() //打印素数 { p[1]=1; for (int i = 4; i <= 10010; i += 2) { p[i] = 1;原创 2013-07-23 21:10:02 · 855 阅读 · 0 评论 -
HDU-1003最大连续子序和
这题的思路很简单,只要连续相加的和大于或等于零,就一直加下去,如果在第i-1项小于零,把sum的值赋值为第i个序列的值。并记录它的下标,就可以了。#include#define N -10000000int main(){ int t,n,j,k,beg,end,cas=1; long sum,max; int a[100001]; scanf("%d",&t);原创 2013-07-25 09:28:17 · 821 阅读 · 0 评论 -
HDU-1002 大数A+B
这道题是模拟加法的,没什么难度。#include#includechar st1[1005],st2[1005];int st3[2005];void Add(){ int i1=strlen(st1)-1,i2=strlen(st2)-1; int carry=0,tmp,i,j=0; for(;i1>=0&&i2>=0;--i1,--i2,++j){ tmp=st原创 2013-07-25 10:04:20 · 698 阅读 · 0 评论 -
HDU-1016 dfs
这题先以为还以为是链表。想多了,只不过是个简单的搜索就可以了。#include#include#includeint n;int p[30],num[30],vis[30];void prime() //筛选素数O(n)的时间复杂度{ memset(p,0,sizeof(p)); for(int i=4;i<100;i+=2) p[i]=1; int k=(in原创 2013-07-25 15:11:23 · 659 阅读 · 0 评论 -
HDU -1261 组合数学。
这题的的公式很好推。先在m个数里进行全排列。由于有相同的,那么就要除去每个相同个数的阶乘。故有公式:A=(a+b+c+d+........)!/(a! *b! *c! *d!.........)另外这是个大数,需要用到高精度了。#includeint num[250],a[30];int n,len;void solve(int m){ int carry,tmp,i,原创 2013-07-24 21:02:50 · 843 阅读 · 0 评论 -
poj-3468 线段树和树状数组的区间更新及求和
题目连接这也算是线段树入门第一道自己完成的题目。因为在以前,看过别人写的线段树区间更新的方法,叫做延迟标记法,意思是:每次更新不需要更新到底部,换句话说:并不需要每个元素一一更新,只有等到下次更新或被询问的时候才更新!.操作的方法就是用一个辅助数组来记录(标记)更新的信息。我们知道线段树又叫区间树,它又是平衡二叉树。线段树的操作是用递归实现的。查找是二分搜索故时间复杂度为(logn)。原创 2013-07-30 11:06:48 · 856 阅读 · 0 评论 -
HDU-2444 二分图的判别和最大匹配数。
题意:n个人,有m对关系,问你能否把他们分成两组,使得他们任意两两之间都不相互认识。如果不能输出“No”否则,问你,他们之间最最多认识的人。分析:题意很明了,一个时要我们判断他们之间能否构成 二分图,另外求二分图的最大匹配数。关于判断二分图。一个最基本的方法就是染色法,意思是:把他们有关系的用两种不同颜色染色。通过邻接矩阵搜索,如果有一对有关系,并且颜色是相同的。那么就不是二分图了原创 2013-07-19 10:40:00 · 775 阅读 · 0 评论 -
poj-1469,1274 二分图匈牙利算法
题目连接题意:学生有各自喜爱的课程,所以对于一个课程可能存在多个学生喜欢它,但我们想要没门课程都有人选。第一个数据,代表测试的个数,接下来是课程p个,学生n个,在接下的p行里,一次代表课程1,2...p,每行 i 第一个字母是科目i喜爱这科目的学生,在输入学生编号。输出:是否能满足要求,能就输出“YES”,否则就输出“NO”。分析:这是个分配问题,自然想到了二分图最大匹配。课程原创 2013-05-02 20:28:40 · 789 阅读 · 0 评论 -
HDU-2899 三分解方程
题目连接裸题!不是三分就是二分了,根据题意,明显的三分搜索。#include#include#define eps 1e-8double count(double x,double y){ return 6 *pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;}int sign(double x){ return xeps;原创 2013-07-17 08:28:31 · 715 阅读 · 0 评论 -
HDU-1058 Humble Numbers
最近自己感觉动态规划这方面太差,就在各大oj上找了一些基础的dp题来A啊。这个dp题,虽说是入门的。但对于我,也有些棘手啊!1-->12--->min(1*2,1*3,1*5,1*7)---->23--->min(2*2,1*3,1*5,1*7)----->34---->min(2*2,2*3,1*5,1*7)----->4;5---->min(2*3,2*3,1*5,1*原创 2013-07-17 10:14:42 · 669 阅读 · 0 评论 -
HDU-1176 数字塔DP
题目连接分析: 0秒 5 1秒 4 5 6 2秒 3 4 5 7 8 3秒 2原创 2013-07-16 20:55:24 · 732 阅读 · 0 评论 -
HDU-1041大数运算+递归
题目连接题意:电脑的内存首先是初始化为1.经过一段时间,变成0 和1。接着分别0变为 10,1又变为01。意思就是(1->0 1)(0->1 0)问经过n步。出现相邻的两个零的个数。分析: 此题,很明显就是找规律,不可能去模拟。多画几个,就大致可推出方程了。 (1,0) ,(2,1),(3,1),(4,3),(5,5),(6,11).........(说明:第一个数代表步数,第二原创 2013-07-16 19:17:06 · 856 阅读 · 0 评论 -
HDU-2199 二分搜索解方程
题目连接分析: 该方程左边的明显就是在[0,100]区间单调递增的,这就适应了二分查找了。直接水过之。#include#include#define eps 1e-10 int sign(double x){ return xeps;}double count(double x){ return 8*pow(x,4)+7*pow(x,3)+2*pow(x,2)+3*原创 2013-07-17 07:58:58 · 908 阅读 · 0 评论 -
HDU-1465错排
错排公式: f(n)=(n-1)*[f(n-1)+f(n-2)];注意:在杭电上用__int 64,用long long 就WA了。#include__int64 f[21];void fun(){ f[1]=0; f[2]=1; for(int i=3;i<=20;i++) f[i]=(i-1)*(f[i-1]+f[i-2]);} int main(){ i原创 2013-07-17 11:11:22 · 694 阅读 · 0 评论 -
HDU 1097 同余与循环群
此题尽管简单。也告诉我们两个常识:同余定理:a+b=c(mod n) a*b=d(mod n)那么: a+b=b+d(mod n) ab=cd(mod n)另外,a^b 它的余数是以四个为一个循环节。(有些是全部相同的,也看做为4)。#includeint main(){ __int64 a,b; int e[4]; while(~scanf("%I原创 2013-07-17 16:35:30 · 974 阅读 · 0 评论 -
poj1159-LCS滚动数组优化。
题目连接题意: 回文,就是从某一个字后面一次往回走。比如abdsdba从s开始后面的字符刚好往回走了,给你一个字符串,问你要插入至少多小个字符可以补成回文。分析:此题就是比较两个正序和逆序的字符的最长公共子序列。由于字符串长度达5000个。开关5000*5000二维数组,是超内存。方法就是。利用滚动数组。#include#include#define max(a,b)原创 2013-07-18 12:54:14 · 873 阅读 · 0 评论 -
HDU-1059 Dividing 多重背包
啊!这题本来很简单,就是不细心,搞的我wa五六次啊,严重受到打击啊!多重背包转化成01背包和完全背包就可以了。这个题,是说能分成开不,那么两个人所拥有的价值是总价值的一半。把背包的容量刚好看成总价的的一半v(本来可以看成无限大)但没必要,因为它刚好用v的体积。那么就是,在容量为v的条件下,看能否把背包装满。这样就可以用多重背包实现了。#include#include#define ma原创 2013-07-25 21:19:01 · 788 阅读 · 0 评论 -
c语言课程设计—学生成绩管理系统
学生成绩管理系统是比较适合初学者的。它涵盖了c语言几乎知识。对于学了c语言的人,把这个课程设计搞好(当然自己能设计出来是要有很好的基础)。不管自己能不能够完成,最重要的是能弄懂。参考其他资料,试着自己编写是不错的选择。这个课程设计也是我参照资料,自己编写的。自己适当地增加了一些功能。不过,编的不够那么专业吧。#include#include#include#define size原创 2013-04-02 14:01:53 · 5688 阅读 · 0 评论 -
poj-1142 Smith Number(分解因子)
题意: 一个数分解成质因子相乘,原数的每个位相加等于分解后的数每个为相加的和。此题就是分解因子。主意,素数不能算,否则WA。#includetypedef long long LL;void bitsum(LL n,LL *s){ int t; while(n){ t=n%10; n/=10; *s+=t; }}int main(){ LL原创 2013-08-10 23:08:42 · 718 阅读 · 0 评论 -
HDU-1060 Leftmost Digit
这题本来不想贴,看上去很简单,但又不明白为什么能这样?这是么定理?#include#includeint main(){ int t; __int64 n; scanf("%d",&t); while(t--){ scanf("%I64d",&n); double a=n*log10(n*1.0); a=a-(__int64)a; //去小数的部分。 p原创 2013-08-12 11:00:54 · 678 阅读 · 0 评论 -
HDU-1199 color the ball
唉!这题完全没必要用线段树,用一个很常规的方法就可以过了。不解释,常规方法就A了。#include#includeint q[100005];int main(){ int n,Lpos,Rpos,a,b,L=100005,R=-1,color; char op[2]; while(scanf("%d",&n)!=EOF){ memset(q,0,sizeof(q));原创 2013-08-12 16:59:20 · 907 阅读 · 0 评论 -
HDU-4704 找规律
本题是要我们看懂题意:S(k)是表示从{x1,x2,x3....xk)中选取k个可以使得x1+x2+x3+...xk=N,问我们求(S(1)+S(2)+....S(k))%Mod=?,Mod=10^9+7;简要分析:s(k) 意思从集合中选取k个元素可以使得他们的和为N,这就相当,ans=(S(1)+S(2)+...S(k))%Mod,这就相当于把数字N拆分有多少种方案,答案是2^(N原创 2013-08-29 20:39:29 · 605 阅读 · 0 评论 -
zoj-2559 The Smart Bomb 简单几何
可以看出:最大的三个圆正好只可能是在三角形最小两个边只和。设有r1,r2,r3为三个圆的半径,d1,d2,d3,是三角形的边,且d3是最长的边。则有:r1+r2=d1,r2+r3=d2;====>r1-r3=d1-d2;又因:r1+r3代入:r1=(d1+d3-d2)/2.代入即可求得其他两个圆的半径。代码:#include #include#includeusing原创 2013-09-06 11:18:07 · 906 阅读 · 0 评论 -
HDU-2036 多边形的面积
简单的几何入门题。把多边形划分成n-2个三角形,然后叉积的一半就是一个三角形的面积,相加就可以了。#includestruct node{ int x,y;}p[105];double count(node a,node b,node c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}int main(){ int原创 2013-08-31 11:58:58 · 664 阅读 · 0 评论 -
HDU-4706 dfs打表
此题的题意很简单,但做起来却有麻烦!如果实在不行,可以把所有的枚举出来。最萌的一种AC方式了!其实此题是有规律的。如果按行列i和j,i+j=n-1正好是对角线的元素,(i从零开始的),故可以这样想:如果从第i行处理,先从每行的列j=0开始,处理到j=n时就结束了。如果在i行的元素有j==0或者最后一列j=n-1表示是每行第一元素和最后一个元素,就该打印,用一个pos来记录打印到字母的位原创 2013-09-09 22:29:15 · 655 阅读 · 0 评论 -
poj2635-大进制转化+同余定理+素数筛选
题目连接这题不知wA多小次了,先是打素数表超时,后是取余数超时。没法,在绝望的情况下看了大牛的,我无语了。。。。。题意:(英语基础不行,题意都很坑爹)。给你一个数,它是由两个素数相乘而得的,再给你一个数M,如果其中有一个素数小于该数M,就输出“BAD”,并且要输出该素数。只有两个素数都它大于这数M,才输出“GOOD”。(这题目废话真多!,何必呢?)分析题目: 一看到素数原创 2013-05-07 17:42:15 · 854 阅读 · 0 评论 -
HDU-4602 partition 找规律
分析:看了解题报告,先没看懂,后来恍然大悟。但k>n 显然是不存在的答案为0;当1分两种情况讨论, 取k个连续的点不包含端点。在n个位置区k个连续的点有n-1-k种,在就是把剩余的n-k-2位置任意分割,相当于n-k-2任意拆分,根据题意提供f(n)=2^n。很快就得到(n-k-1)*2^(n-k-2);如果含有端点,最前和最后,有2种,那么就有2*2^(n-k-1)加原创 2013-08-09 21:19:11 · 635 阅读 · 0 评论 -
poj-2914 最小割stoer算法
这题说是模板题,用stoer算法可以过,关于这个算法,网上很多雷同的讲解,自己就没必要再贴一份了(搞不清谁是原著)贴一个模板吧(提交是8000多ms,看牛人将可以达到500多ms,求牛人指点啊)#include#include#include#define INF 1000000000using namespace std;const int N=505;int graph[N原创 2013-08-10 10:45:57 · 752 阅读 · 0 评论 -
HDU-4662 MU puzzle
此题是找规律题,发现规律就不难了。首先,可以肯定字符串中只能有一个‘M",而且必定在第一个。先做出来I相当于1,U相当于3.我们发现三个I相当于一个U,而U是由I变来的,把U还原成3个I,I的个数总是2^n个,而三个U相当于一个U,也就意味着在原来的变换中会多出6个I。所以可以推测sum%6==2||sum%6==4,最后剩下2和4,都可以变。考虑MI是原来的字串,所以sum=1也算。原创 2013-08-09 09:07:01 · 724 阅读 · 0 评论 -
HDU-1431素数回文
看到素数又想到了素数打表。但这题数据太大,恐怕还没输入就超时了。彻底不知道怎么办,看来discussion才知道最大素数回文。还有些人直接打表,简直是碉堡了!不过我以向不喜欢这样的死算法。好了废话小说,知道最大的回文素数(998899)这样就好办了,开个bool型数组还是过的去的,线性打素数表无压力了。代码:(220ms)#include#include #define M 9原创 2013-07-26 22:14:32 · 806 阅读 · 0 评论 -
HDU-1166 敌兵布阵(树状数组和线段树)
这个题目就是对一组数据的更新和分段求和。由于数据过大,我们就会想到用树状数组。当然,先要了解它。这个题就是它的一个典型应用#include#includeint a[50005],c[50005],n;;void Add(int x,int s){while(x<=n){ c[x]+=s; x+=(x&-x);} } int sum(int x){ int s=0原创 2013-03-31 22:36:43 · 758 阅读 · 0 评论 -
poj1151-线段树与离散化,扫描线
题目连接网上很多人都说这题很经典,值得做一做,可对于刚学线段树的Acmer似乎有难度,我也不列外,搜了很多人的结题报告,也没几个人说清楚,完全不会!只好拿着别人代码来敲,一步一步理解。画了一张图。也让我知道什么是离散化,什么是扫描线。这也就说明了每次扫描相邻的两条边,并计算出y,那么就需要更新边。这样就把矩形分割了。#include#include#includeus原创 2013-07-28 22:55:54 · 657 阅读 · 0 评论 -
HDU-1394 Minimum Inversion Number(线段树)
牛人专题训练算是会把基本线段树的操作会了,不过,线段树操作非常灵活,线段树只是一个结构,它并没有存什么信息,它主要是节点保存了区间的信息。在这个节点中。可以任意添加一些信息,这要根据不同题目而定了,所以线段树比树状数组适应的范围更广,不过在操作上看,树状数组比线段树要简单的多,而且效率比线段树要好。所以,如果题目能用树状数组就尽量用树状数组。这题怎么说呢,我会写线段树,也不会用。不原创 2013-07-28 22:14:56 · 574 阅读 · 0 评论 -
爬天梯-递归方程(类似整数分解)
题目连接题目分析:这题是一道常规题,看似把数分解,有多种可能,其实与走台阶是相通的,如果一个最多能跨过两个阶梯,那么要走完n个阶梯,有多种可能,高中这题是在计数原理里面的,非常简单,看看思路,你就非常明白了:推理:不管你中间怎样走,最后只有两种可能,要么最后一步只剩下一个台阶,要么剩下两个台阶。假设前面有f(n-1)和f(n-2)种。那么就有:原创 2013-05-19 19:15:22 · 1049 阅读 · 0 评论 -
HDU-4477滚动数组+递推(整数分解)
题目连接题意:给定绳子的长度,只可以把绳子剪成任意长度为整形的且彼此不相同,问有多小种不同剪的方案。比如 4=1+3。5=1+4. 5=2+3。6=1+2+3. 6=1+5. 6=4+2。分析:首先,我们可以发现,一个大于2的整数,可以分成一个最多的连续自然数相加,并且,一个大于2的整数至少可以分成2个不相同的整数相加,方案数为(n-1)/2。如果用a[i][j]表示第i个原创 2013-07-13 11:59:17 · 875 阅读 · 0 评论 -
HDU-4651 整数分解(生成函数)
题目连接题意:将数字n分解,求p(n)得个数。听说很多人都在看这个:点击打开链接我也不多说了:#include#define mod 1000000007__int64 f[100005];int w[100005];int main(){ int p=1,t,n; w[0]=0; for(int i=1;w[p-1]<=100000;i++){ w[p++]=原创 2013-08-07 10:25:27 · 802 阅读 · 0 评论