![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
程序设计与算法(二)算法基础
yanyanwenmeng
这个作者很懒,什么都没留下…
展开
-
1.1 小于n的最大素数,完美立方
求小于n的最大素数(筛选法) #include<iostream>#include<cstring>#define MAXN 10000using namespace std;char isprime[MAXN];int main(){ int n; cin >> n; memset(isprime,1,sizeof(ispri...原创 2018-09-18 17:47:48 · 2045 阅读 · 0 评论 -
3.3 放苹果
将递归的问题分解为子问题来做(分类)当m、n很大时,要用动态规划来做,否则会超时。主要分为两大类,假设m为苹果数,n为盘子数当m<n时,此时肯定有空盘子,只需要将m个苹果放进m个盘子中就可以了。f(m,m).当m>=n时,又要分为两种情况,盘子为空和盘子不为空。当盘子有空的情况:此时至少要有一个盘子为空,此时就转换成将m个苹果放进n-1和盘子中...原创 2018-09-29 15:44:42 · 228 阅读 · 0 评论 -
3.4 算24
浮点数比较相等要用绝对值小于某个数(精度)来看。思路:要看4个数进行运算的结果是否为24,必须是先有两个数进行加减乘除运算,最后就只剩3个数了;然后再在3个数中选两个数进行加减乘除运算,最后加上运算结果就只有两个数了,这两个数再进行加减乘除运算,最后就只剩一个数了,就需要这样递归的来预算,看最终计算的最后一个数是否与24相等,如果相等就输出YES,不相等就输出NO。这...原创 2018-09-29 22:09:03 · 449 阅读 · 0 评论 -
第三周测验 简单的整数划分问题和Boolean Expressions
006:简单的整数划分问题描述将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。输入标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。输出对于...原创 2018-09-30 17:09:34 · 673 阅读 · 0 评论 -
4.1 分治算法:归并排序
分析:参考自https://www.cnblogs.com/chengxiao/p/6194356.html归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"...转载 2018-10-09 22:46:07 · 496 阅读 · 0 评论 -
4.2 快速排序
快速排序的原理:比如有3个数4 7 2,我们把4作为关键字,把比4小的数排在4左边,把比4大的数排在4右边,最后的结果就为2 4 7。同理,当数很多的时候:第一步:我们可以选择第一个数为关键字,把比关键字小的排在关键字左边,把比关键字大的排在关键字右边。第二步:将关键字左边的数再次进行快速排序。第三步:将关键字右边的数再次进行快速排序。当a[j]>k的时候,j--,指标...原创 2018-10-10 11:16:15 · 174 阅读 · 0 评论 -
4.3 输出前m大的数 时间复杂度O(n+mlog(m))
#include<iostream>using namespace std;void swapM(int &a, int &b){ int tmp = a; a = b; b = tmp;}int t = 0;int n = 9;int a[] = {1,4,7,2,5,8,3,6,9};//用治处理 ...原创 2018-10-10 15:46:14 · 464 阅读 · 0 评论 -
4.4 求排列的逆序数
7622:求排列的逆序数描述在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序。...原创 2018-10-10 17:30:57 · 454 阅读 · 0 评论 -
6.1 动态规划:数字三角形
在上面的数字三角形中寻找一条从顶部到底边的路径,使得 路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。输入:57 3 88 1 02 7 4 44 5 2 6 5输出:30 解析:如果要算第1行第1个数字到底边的最大和,就要先算第2行第1个数字以及第2行第2个数字到底边的最大和;要算第2行第1个数字...原创 2018-10-25 10:22:42 · 493 阅读 · 0 评论 -
6.2 动态规划解题的一般思路
人人为我,就是已知指向人人,未知指向我,由已知推向未知的情况 来自算法图解:背包问题:最长公共子串:最长公共子序列: 1. 动态规划可帮助你在给定约束条件下找到最优解。在背包问题中,你必须在背包容量给定的情况下,偷到价值最高的商品。2. 在问题分解为彼此独立且离...原创 2018-10-29 12:22:26 · 342 阅读 · 0 评论 -
3.2 爬楼梯
用递归将问题分解为规模更小的子问题,一定要找到递归的边界,避免无穷递归下去。#include<iostream>using namespace std;int f(int n){ if(n == 1) return 1; else if(n == 2) return 2; else return f(n-1)+f(n-2);}i...原创 2018-09-29 15:16:59 · 234 阅读 · 0 评论 -
3.1 表达式求值(递归实现)
表达式可以是只有一个项组成,或者是多个项加减组成;项可以由一个因子组成,或者是多个因子乘除组成;因子可以由一个整数或者一个(表达式)组成。#include<iostream>#include<cstring>using namespace std;int term();int expr();int factor();...原创 2018-09-29 09:22:41 · 1230 阅读 · 3 评论 -
1.2 生理周期
【思路】本题要同时满足三个周期的时间,只要满足求取的数同时是这三个周期的倍数,即用天数对这三个周期取模的值要为0,但这样还有很多情况多算了,会浪费很多时间。其实满足体力高峰后,在下一个体力高峰之前,是不会有情感高峰的,毕竟要同时满足是体力和情感高峰。在同时满足体力和情感高峰后,在下一次体力和情感高峰之前,是不会有智力高峰的。所以这里枚举时可以跳过不必要的天数。 ...原创 2018-09-19 00:06:19 · 300 阅读 · 0 评论 -
1.4 熄灯问题(枚举,位运算)
1222:EXTENDED LIGHTS OUT描述In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each). Each button has a light. When a...原创 2018-09-24 23:18:11 · 569 阅读 · 0 评论 -
第一周测验(枚举) 特殊密码锁(二进制)+拨钟问题
001:特殊密码锁描述有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。输入...原创 2018-09-25 16:23:19 · 1902 阅读 · 2 评论 -
2.1 递归 求阶乘
递归和普通函数调用一样是通过栈来实现的,当调用到最后一层,就需要进行退栈操作。#include<iostream>using namespace std;int f(int n){ if(n==1)//边界条件 return 1; else return n*f(n-1);//递归条件 } int main(){ int n; ci...原创 2018-09-25 19:57:35 · 322 阅读 · 0 评论 -
2.2 汉诺塔问题
#include<iostream>using namespace std;int t = 0;void mov(int n,char a,char b,char c){ if(n==1) { cout << ++t << ":" << a <<"->" <&a原创 2018-09-26 10:51:21 · 247 阅读 · 0 评论 -
1.3 称硬币
枚举每一枚硬币,假设他是假的轻的硬币,然后对每个硬币进行判断,看看假设是否成立。如何判断硬币是轻的假币、重的假币还是真币呢?可以先假设它就是轻的假币,然后看看它是否3次称量的结果都满足是轻的假币。一、假设硬币是假的1. 轻币:判断右边天平的情况,只要有一个不满足,假设就不成立;只有同时三次测量都满足了,才说明假设成立。2. 重币:判断右边天平的...原创 2018-09-20 22:54:12 · 580 阅读 · 0 评论 -
2.3 N皇后(递归替代多重循环)DFS
当第k行与前面的k-1行不冲突的时候,才将皇后放在不冲突的位置。 for(i = 1; i <= N; i++)//(i列)前面的(k-1)行皇后已经摆好,看第k行的i列皇后摆放位置是否和前面的k-1行冲突 { int j; for(j = 1; j < k; j++)//前面的k-1行(j行) { if(queenPo...原创 2018-09-27 11:31:28 · 284 阅读 · 0 评论 -
2.4 逆波兰表达式(递归)
#include<iostream>#include<stdlib.h>using namespace std;double f(){ char s[20]; cin >> s; switch(s[0]) { case '+': return f()+f(); case '-': return f()-f(); ca...原创 2018-09-27 16:13:29 · 455 阅读 · 0 评论 -
第二周测验 全排列、2的幂次方表示
003:全排列描述给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。输入输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。输出输出这个字符串的所有排列方式,每行一个排列。要求...原创 2018-09-28 17:16:32 · 320 阅读 · 0 评论 -
NOIP2015普及组初赛试题
https://blog.csdn.net/a2392008643/article/details/81781766二、问题求解1. 重新排列1234使得每一个数字都不在原来的位置上,一共有( )重排法答案:9种数比较少可以用枚举:刚开始的排列 1 2 3 4,则求1 不能排在第1个位置,2不能排在第二个位置,3不能排在第3个位置、4不能排在第4个位置的情况...原创 2019-08-06 18:11:16 · 2788 阅读 · 0 评论