
算法
brucehb
这个作者很懒,什么都没留下…
展开
-
第九届蓝桥杯(国赛)——阅兵方阵
【问题描述】x国要参加同盟阅兵活动。主办方要求每个加盟国派出的士兵恰好能组成 2 个方阵。x国发现弱小的 y国派出了130人的队伍,他们的士兵在行进中可以变换2种队形:130 = 81 + 49 = 92 + 72130 = 121 + 9 = 112 + 32x国君很受刺激,觉得x国面积是y国的6倍,理应变出更多队形。于是他发号施令:我们要派出一支队伍,在行进中要变出 12 种队形!!!手下人可惨了,要忙着计算至少多少人才能组成 12 种不同的双方阵。请你利用计算机的优势来计算一下,至少原创 2022-06-18 23:48:57 · 392 阅读 · 1 评论 -
第十一届蓝桥杯 ——互质
问题描述今年是 2020 年,今天是 10 月 18 日。请问在 1 到 2020 中,有多少个数与 1018 互质。答案提交这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案:1008思路:用欧几里得方法分别计算每个数和1018的最大公约数。#include <iostream>#include <cstdio>using namespace std;int gcd原创 2022-02-04 23:05:04 · 7222 阅读 · 0 评论 -
第十届蓝桥杯 ——求和
问题描述小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。请问,在 1 到 2019 中,所有这样的数的和是多少?答案提交这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案:1905111#include <iostream>using namespace std;bo.原创 2022-02-03 23:15:24 · 5734 阅读 · 0 评论 -
第十一届蓝桥杯 ——Fibonacci 集合
问题描述小蓝定义了一个 Fibonacci 集合 F,集合的元素如下定义:最小的 5 个 Fibonacci 数 1, 2, 3, 5, 8 属于集合 F。如果一个元素 x 属于 F,则 3x + 2、5x + 3 和 8x + 5 都属于集合 F。其他元素都不属于 F。请问,这个集合中的第 2020 小元素的值是多少?答案提交这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案:41269#in.原创 2022-01-23 18:37:26 · 2166 阅读 · 0 评论 -
单向链表归并排序
#include using namespace std;struct Node{ int value; Node *next;};Node* merge(Node *left, int leftLen, Node *right, int rightLen){ if (NULL == left || NULL == right) {原创 2012-11-08 03:05:31 · 455 阅读 · 0 评论 -
全排列打印(二)
给出数字1,2,3。打印出序列:1, 2, 3, 12, 23, 13, 123。#include using namespace std;bool status[3] = {false, false, false};void print(int a[], int pos, int n){ if (pos == n) { for (int i原创 2012-11-09 00:00:53 · 421 阅读 · 0 评论 -
全排列打印(一)
给出数字1,2,3.打印出所有可能的排列。如:123, 132, 213, 231...#include using namespace std;void print(int a[], int begin, int n){ if (begin == n) { for (int i = 0; i < n; i++) {原创 2012-11-08 22:46:18 · 418 阅读 · 0 评论 -
单向链表应用
给出一个四则运算表达式,其中每个数字均为小于等于9且大于等于0。不考虑溢出,计算结果。表达式如"1+2*3-6+5-8/2+1+7"。#include using namespace std;struct Node{ int value; Node *next;};int calculate(char a[]){ if (NULL == a)原创 2012-11-12 22:46:43 · 404 阅读 · 0 评论 -
堆排序
void maxHeapify(int a[], int n, int k){ if (NULL == a) { return; } int left = 2*k + 1; int right = 2*k + 2; int max = k; if (left < n && a[max] < a[left]) { max = left; } if (right < n原创 2012-11-14 17:56:13 · 320 阅读 · 0 评论 -
二叉树先序遍历(非递归)
#include #include using namespace std;struct Node{ int value; Node *left; Node *right;};void preOrderTraverse(Node *root){ if (NULL == root) { return; } stack buf; buf.push(root);原创 2012-11-15 14:18:35 · 418 阅读 · 0 评论 -
二叉树先序遍历(递归)
#include using namespace std;struct Node{ int value; Node *left; Node *right;};void preorderTraverse(Node *root){ if (NULL == root) { return; } cout v原创 2012-11-15 00:35:18 · 454 阅读 · 0 评论 -
二叉树中序遍历(非递归)
#include #include using namespace std;struct Node{ int value; Node *left; Node *right;};void inorderTraverse(Node *root){ if (NULL == root) { return; }原创 2012-11-20 00:29:55 · 588 阅读 · 0 评论 -
二叉树后序遍历(递归)
#include using namespace std;struct Node{ int value; Node *left; Node *right;};void postorderTraverse(Node *root){ if (NULL == root) { return; } postorder原创 2012-11-20 00:55:29 · 493 阅读 · 0 评论 -
二叉树中序遍历(递归)
#include using namespace std;struct Node{ int value; Node *left; Node *right;};void inorderTraverse(Node *root){ if (NULL == root) { return; } inorder原创 2012-11-19 22:27:06 · 632 阅读 · 0 评论 -
二叉树后序遍历(非递归)
#include #include using namespace std;struct Node{ int value; Node *left; Node *right;};void postorderTraverse(Node *root){ if (NULL == root) { return; }原创 2012-11-20 20:51:12 · 394 阅读 · 0 评论 -
单向链表逆转(递归)
struct Node{ int value; Node *next;};//head为原始链表的头节点,p初始值为head,newHead用来存储逆转后的头节点void reverse(Node *head,Node *p, Node* &newHead){ if (NULL == head) { newHead = NULL;原创 2012-11-22 22:46:08 · 704 阅读 · 0 评论 -
计算两个字符串的最长公共子字符串
计算两个字符串的最长公共子字符串。如"BACABA","ABCBDAB"的最长公共子字符串为“BCAB”。若有多个相同长度最长公共子字符串,打印其中之一即可。#include #include using namespace std;int maxCommonSubStr(char *a, int m, char *b, int n){ if (m < 1 || n < 1原创 2013-02-01 01:24:52 · 808 阅读 · 0 评论 -
大数阶乘
输入一个小于1000的正整数,打印n! = 1*2*3*...*n的值。#include #include using namespace std;const int maxn = 3000;void fun(int n){ int i, j; int f[maxn]; memset(f, 0, sizeof(f));原创 2013-03-13 01:30:03 · 527 阅读 · 0 评论 -
循环位移
一个长度为n的整形数组,将其循环右移k位。要求时间复杂度为O(n),空间复杂度为O(1)。void reverse(int a[], int left, int right){ while (left { swap(a[left], a[right]); left++; right--;原创 2013-03-19 22:12:34 · 704 阅读 · 0 评论 -
有序数组最小绝对值。
一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值。int search(int a[], int n){ if (a == NULL) { return -1; } int left = 0; int right = n - 1; while (left < right-1) {原创 2013-01-29 23:44:33 · 803 阅读 · 0 评论 -
用递归方式将栈内容翻转
比如:原来栈中从顶到底的元素分别为1, 2, 3, 4, 5。.翻转后栈中从顶到底应分别为5, 4, 3, 2, 1。#include using namespace std;void addToStack(stack &buf, int value){ if (buf.empty()) { buf.push(value);原创 2013-03-27 00:28:52 · 1028 阅读 · 0 评论 -
单向链表旋转
给定一个单向链表,设计一个算法实现链表向右旋转K个位置。举例:给定:1->2->3->4->5->6->null 并且K=3,则有:4->5->6->1->2->3->null。struct Node{ int value; Node *next;};Node* revert(Node *head, unsigned int k){原创 2013-07-12 23:33:41 · 1155 阅读 · 0 评论 -
循环左移数组
对于有n个元素的数组 int a[n]={....};写一个高效算法将数组内容循环左移m位。比如: int a[6] ={1,2,3,4,5,6} ,循环左移3位得到结果{456123}。要求时间复杂度O(n), 空间复杂度O(1)。void swapArray(int a[], int begin, int end){ while (begin {原创 2013-07-13 00:21:57 · 1042 阅读 · 0 评论 -
打印蛇形方阵
输入正整数n,要求打印出n*n的蛇形方阵。如n=4时打印如下: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4#incl原创 2013-06-28 01:28:49 · 2297 阅读 · 0 评论 -
整理字符串
void removeSpace(char *a){ int n = strlen(a); int begin = 0; int end = n - 1; for (int i = 0; i { if (a[i] != ' ') { begin = i;原创 2013-03-26 23:42:57 · 765 阅读 · 0 评论 -
按递增顺序打印数字n所有排列
给定某属于1-9的正数n,顺序打印出所有排列。如:n=3,则顺序打印出123, 132, 213, 231, 312, 321。#include using namespace std;struct node{ int value; node *prev; node *next;};void print(const node * const head原创 2013-03-02 22:59:30 · 1435 阅读 · 0 评论 -
限定条件排序
#include using namespace std;void sort(int a[], int n){ int zeroPos = 0; for (int i = 0; i { if (a[i] == 0) { zeroPos = i;原创 2013-03-25 01:16:30 · 1112 阅读 · 0 评论 -
查找有毒水
最少需要10只。思路:将1000瓶水按照二进制从1编号到1000。这样最大数的二进制位数为10。用10只老鼠分别对应二进制的第0到第9位,每只老鼠喝下该二进制位为1的瓶子的水,如果该老鼠一周后死掉,就说明有毒瓶的该二进制位为1,否则说明为0。这样就能确定有毒瓶的二进制数。原创 2013-03-25 01:32:43 · 1288 阅读 · 0 评论 -
数字排列
用1,2,3,...,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出所有解。#include #include #include int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};char found = 0;void swap(int *a, int *b){ int temp;原创 2013-07-02 00:40:46 · 706 阅读 · 0 评论 -
打印倒三角形
输入正整数n<=20,输出一个n层的倒三角形。例如n=5时输出如下:######### ####### ##### ### ##include #include #include int main(){ int n, i, j; scanf("%d", &n); for (i = 0; i < n; i++)原创 2013-07-01 23:11:02 · 1032 阅读 · 0 评论 -
子序列的和
输入两个正整数n#include #include #include double fun(int n, int m){ double result = 0; while (n <= m) { result += 1.0/n/n; n++; } return result;}int main()原创 2013-07-04 22:57:52 · 688 阅读 · 0 评论 -
分数化小数
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c为。a,b#include #include #include double fun(int a, int b, int c){ double result = 0; result = (double)a/(double)b; return result;}int main(){原创 2013-07-04 23:23:15 · 933 阅读 · 0 评论 -
进制转换1
输入基数b(2#include #include #include int result[100];void fun(int b, int n){ int i = 0; while (n) { result[i] = n%b; n /= b; i++; }}int main(){原创 2013-07-04 23:57:56 · 907 阅读 · 0 评论 -
进制转换2
输入基数b(2#include #include #include int fun(int b, int n){ int base = 1; int result = 0; while (n) { result += (n%10)*base; base *= b; n /= 10; }原创 2013-07-24 23:20:04 · 547 阅读 · 0 评论 -
无重复全排列
输入一个字符串,打印出所有排列,要求没有重复:如:输入“aab”, 输出:"aab", "aba", "baa".#include #include using namespace std;bool exchangeable(string &s, int begin, int end){ for (int i = begin; i < end; i++) {原创 2013-08-03 12:22:25 · 1189 阅读 · 0 评论 -
旋转矩阵
一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像逆旋转90度。 要求原地进行操作(即不开辟额外的存储空间)。如输入: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16则应转换为: 4 8原创 2013-08-07 23:30:15 · 719 阅读 · 0 评论 -
将栈按升序排序
写程序将一个栈按升序排序。对这个栈是如何实现的,你不应该做任何特殊的假设。 程序中能用到的栈操作有:push | pop | top | empty。#include using namespace std;void sort(stack &s){ stack t; while (!s.empty()) { int val = s.top(); s.pop(); wh原创 2013-08-09 23:19:35 · 1318 阅读 · 0 评论 -
用两个栈实现一个队列
使用两个栈实现一个队列MyQueue#include using namespace std;template class myQueue{ public: void push(T val) { sin.push(val); } void pop() { move(sin, sout); sout.pop(); } T front()原创 2013-08-09 22:18:12 · 621 阅读 · 0 评论 -
数组归并排序
A和B是两个有序数组(假设为递增序列),而且A的长度足以放下A和B中所有的元素, 写一个函数将数组B融入数组A,并使其有序。oid merge(int a[], int b[], int n, int m){ int k = m+n-1; int p = n-1; int q = m-1; while (p >= 0 && q >= 0) { if (a[p] > b[q])原创 2013-08-11 10:18:21 · 1399 阅读 · 0 评论 -
合并总数
求正数数组内和为指定数字的组合总数比如[5, 5, 10, 2, 3] 合并值为 15 :有4种组合 : (5 + 10, 5 + 10, 5 + 5 + 2 + 3, 10 + 2 + 3)只需输出组合总数即可,不需打印组合内容。int fun(int a[], int n, int m){ int **buf = new int*[n]; for原创 2013-08-11 00:05:56 · 606 阅读 · 0 评论