算法入门
w1234fd
这个作者很懒,什么都没留下…
展开
-
hdu 2190 重建希望小学
题目 【类似hdu 2046 骨牌铺方格】 注意思考:(老师提醒点) 例如:3 -> 5,为什么是2种变化,而不是 3种变化?答:用6块1米×1米的地砖时,经过状态4,已经被考虑,不能重复考虑。 #include<stdio.h> int main(){ long long ans[35];//注意防递推值太大,定义为long long型 int t; ans[1]=1; ans[2]=3; for(int i=3;i<=30;i++){ ans[i]=ans[i-原创 2021-05-21 19:23:06 · 96 阅读 · 0 评论 -
hdu 2046 骨牌铺方格
骨牌铺方格 题目 分析 F(0) = 0,没有地方摆骨牌,所以为0; f(1) = 1,只能竖着摆放1个骨牌;(1种铺放方案) f(2) = 2,可以是横着摆放2个骨牌,或者竖着摆放2个骨牌;(1种铺放方案) f(n) = f(n-2) + f(n-1),n>2,可以在f(n-2)的基础上在右边再横着放2个骨牌(竖着放已经在f(n-1)中),也可以在f(n-1)的基础上在右边再竖着1个骨牌。 【类似于超级楼梯】 代码: #include<stdio.h> int main() { i原创 2021-05-16 17:49:10 · 127 阅读 · 0 评论 -
hdu 2044 一只小蜜蜂...
** 一只小蜜蜂…** 题目 题目分析如下图 问题分析:这个问题非常类似于我之前写的:hdu 超级楼梯,略微有些不同。 站在第n个蜂房想一下,前一步是从哪里来的,问题就清楚了。 分析: 看图可知,由于蜜蜂每次只能从前1个蜂房前2个蜂房过来,那么f(n)=f(n-2)+f(n-1)。这部就是一个菲波拉契数列吗?就是一个递推问题? 可是,开始时候,蜜蜂是在第1个蜂房,所以数列的开始几项会有所不同。 f(1)=0,因为蜜蜂开始在第1个蜂房; f(2)=1,蜜蜂只能从第1个蜂房来到第2个蜂房; f(3)=2,蜜蜂原创 2021-05-16 17:23:33 · 122 阅读 · 0 评论 -
hdu 2041 超级楼梯
超级楼梯 题目 从题目中推出下图关系图 由图可知:计算 F(n) 时,主要时求出F(n-1)与F(n-2)的值,再求两者之和。类似于斐波那契数列 递推的关键 1.在计算 F(n) 时,要保证F(n-1)、F(n-2)、F(n-3)、……、F(2)、F(1) 已全部完成计算 2.计算的次序是F(1)、F(2)、F(3)、……、F(n-2)、F(n-1)、F(n) #include<stdio.h> int main() { int n,m; long long a[50]={0,1,1};/原创 2021-05-16 16:40:26 · 77 阅读 · 0 评论 -
hdu 1232 畅通工程
畅通工程 思路 城市之间由道路连接,相连的城市可以看做一个集合,如:a、b相连,c、d相连,则a和b属于集合A,c和d属于集合B。之后又有人告诉你b和e相连,那么就把e加入到集合A中,以此类推。然后不同集合若是想组成一个大的集合,即集合A和集合B若相连接在一起,那随便在两个集合中分别找两个城市连接在一起就可以了。 考点 并查集 #include<stdio.h> int fa[1010]; int find(int i){//寻找 根(父节点) if(fa[i]!=i){//领导人的集合就是原创 2021-05-11 00:36:38 · 55 阅读 · 0 评论 -
hdu 1098 Ignatius‘s puzzle
Ignatius’s puzzle 添加链接描述 思路 1、先把题目含义给搞明白:给定一个方程式f(x)=5x13+13*x5+ka*x,给定一个非负整数k,求能不能找到一个尽量小的非负整数a,使得上述方程式中的x任意取值,结果都能被65整除,如果有,输出a的值,否则输出no #include <bits/stdc++.h> using namespace std; int main(){ int k; while(scanf("%d", &k) == 1){原创 2021-04-09 17:03:49 · 61 阅读 · 0 评论 -
hdu 2199 Can you solve this equation?
Can you solve this equation? 函数求导成单调,采用二分法 添加链接描述 老师做法1:二分,精度控制 #include <bits/stdc++.h> using namespace std; // 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 #define f(x) (x*(x*(x*(x*8+7)+2)+3)+6) double binSearch(double l, double r, double val){ double mid原创 2021-04-09 16:43:57 · 64 阅读 · 0 评论 -
hdu 1019 Least Common Multiple最小公倍数
Least Common Multiple最小公倍数添加链接描述 1019题编程 结论:遇最小公倍数,想辗转相除法 1.使用辗转相除法要快速,节时。 #include<stdio.h> int main(void) { int a[10010],b,i,t,m,n,z,gbs; scanf("%d",&t); while(t){ scanf("%d",&b); for(i=0;i<b;++i){ scanf("%d",&a[i]);原创 2021-03-28 20:58:35 · 74 阅读 · 0 评论 -
hdu 2899 Strange fuction
Strange fuction 函数求导看凸性用三分法 添加链接描述 //三分法 #include <bits/stdc++.h> using namespace std; //F(x) = 6*x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100) #define F(x, y) (x*(x*(x*(x*(x*(x*(6*x+8)))+7)+5)-y)) double solve(double l, double r, double原创 2021-04-09 15:44:35 · 62 阅读 · 0 评论 -
hdu 1060 Leftmost Digit
思路: eg:Nlog10N =3.14 NN=103.14= (100.14)*103=x,xxx…*103 //红色部分就是最高位原创 2021-04-01 23:21:47 · 51 阅读 · 0 评论 -
hdu 2035 人见人爱A^B
人见人爱A^B (请输出A^B的最后三位表示的整数) 添加链接描述 思路:类同1097题的做法 根据数据范围,此题肯定不能直接求出a^b,然后再求百位,这样必然超时。好在题目仅要求乘积的百位部分,因此,一次乘一个a,留下乘积的百位部分,继续跟a相乘。如此往复,直到完成b的连乘。 #include<stdio.h> int main(){ int m,n; while(~scanf("%d%d",&m,&n)&&(m||n)){ int sum=1; w原创 2021-04-01 23:05:51 · 49 阅读 · 0 评论 -
hdu 1097 A hard puzzle
A hard puzzle (艰难的难题) (求a^b’s the last digit number) 添加链接描述 开始使用暴力算法,结果肯定是time exceed ,后来想到了简便算法,第一个数a只用考虑个位,然后对0-9的每个数进行乘方比较,发现都是以4为周期的函数,结果就很容易得出来了 eg:各个个数的几次方的个位数 0: 1,0,0,0,… 1: 1,1,1,1… 2: 1,2,4,8,6,2,… 3: 1,3,9,7,1… 4: 1,4,6,4,… 5: 1,5,5,5… 6: 1,6,6,原创 2021-04-01 22:58:00 · 108 阅读 · 0 评论 -
hdu 1021 Fibonacci Again 斐波那契数列
Fibonacci Again 斐波那契数列 添加链接描述 法1 F(N)%3=(F(N-1)%3+F(N-2)%3)%3 (运用到模运算) #include <stdio.h> #include <stdlib.h> int F(int n){ if(n<2) { if(n==0) return 7; else if(n==1) return 11; else原创 2021-04-01 21:56:42 · 95 阅读 · 0 评论 -
hdu 1108 最小公倍数
最小公倍数 特点:最小公倍数=n*m/最小公约数 (采用辗转相除法快速解定战场) 添加链接描述 1108题编程 #include<stdio.h> int main() { int n,m,tn,tm,a; while((scanf("%d%d",&n,&m))!=EOF){ tn=n;//开始 tm=m; a=n%m; while(a){ n=m; m=a; a=n%m; }//结束 printf("%d\n",(tn*tm)原创 2021-04-01 21:20:45 · 76 阅读 · 0 评论 -
hdu 1001 Sum Problem A+B
Sum Problem A+B(输入与输出形式问题) 添加链接描述 1001题编程 #include<stdio.h> int main() { int a,n; int i; while(scanf("%d",&a)!=EOF){//注意1 n=0; for(i=1;i<=a;++i){ n+=i; } printf("%d\n\n ",n);//注意2 } return 0; } 1.这是一道四处可见的A+B练习原创 2021-04-01 21:01:03 · 74 阅读 · 0 评论