蓝桥杯

[蓝桥杯][基础训练]Huffuman树

余生长醉 提交于 2020-02-10 15:02:12
Description Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 给出一列数 { p i }={ p 0 , p 1 , …, p n -1 },用这列数构造Huffman树的过程如下: 1. 找到{ p i }中最小的两个数,设为 p a 和 p b ,将 p a 和 p b 从 { p i }中删除掉,然后将它们的和加入到{ p i }中。这个过程的费用记为 p a + p b 。 2. 重复步骤1,直到{ p i }中只剩下一个数。 在上面的操作过程中,把所有的费用相加,就得到了构造 Huffman树的总费用。 本题任务:对于给定的一个数列,现在请你求出用该数列构造 Huffman树的总费用。 例如,对于数列 { p i }={5, 3, 8, 2, 9},Huffman树的构造过程如下: 1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{ p i }中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。 2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{ p i }中删除它们并将和10加入,得到{8, 9, 10},费用为10。 3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{ p i }中删除它们并将和17加入,得到{10, 17},费用为17。 4. 找到

[蓝桥杯][基础训练]FJ的字符串

此生再无相见时 提交于 2020-02-10 11:03:01
Description FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其中的规律并写所有的数列AN吗? Input 仅有一个数:N ≤ 26。 Output 请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。 Sample Input 3 Sample Output ABACABA 1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int n; 5 scanf("%d",&n); 6 string a="A"; 7 string b="A"; 8 char s='A'; 9 int m=n-1; 10 while(m--){ 11 s+=1; 12 a+=s; 13 a+=b; 14 b=a; 15 } 16 cout<<a<<endl; 17 return 0; 18 } 一共进行n-1次转换 代码中定义了两个字符串a,b,初始化为A 还有一个字符s,初始化为A 字符s每次先自增1 它的变化就是ABCDEF.....这样 然后a后面接上s, 然后在接上b, 然后再让b和a变得一样 然后循环就行了 来源: https://www.cnblogs.com/fate-

第九届蓝桥杯大赛软件类国赛

我与影子孤独终老i 提交于 2020-02-09 23:44:19
文章目录 第九届蓝桥杯大赛软件类国赛 国赛C++ A组 三角形面积 阅兵方阵 找假币 约瑟夫环 -- important 自描述序列 -- todo 采油 -- todo 国赛C++ B组 换零钞 激光样式 格雷码 调手表 搭积木 -- important 矩阵求和 -- important 第九届蓝桥杯大赛软件类国赛 这些题官网还没有解答的,我主要参考了b站UP主大雪菜的解法(绝大部分题先自己做了一遍),当然也网上查了一些解答,但发现现在网上的一些解法并不正确,希望可以给大家一个参考。 具体题目官网可以下载。 我的代码应该避免不了错误(填空题还是可以保证的 o_o …),如果有任何问题,欢迎大家评论指正。 国赛C++ A组 三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) 求该三角形的面积。 注意,要提交的是一个小数形式表示的浮点数。 要求精确到小数后3位,如不足3位,需要补零。 思路 有很多方法: 海伦公式: (p=(a+b+c)/2) S=sqrt[p(p-a)(p-b)(p-c)] 余弦定理求出一个角,然后面积即为底*高/2 二维向量叉乘公式a(x1,y1),b(x2,y2),则a×b=(x1y2-x2y1),面积即为两边组成的向量叉乘/2 我挑一个初中就学了的公式吧(其实我只记得这个

[蓝桥杯][基础训练]芯片测试

牧云@^-^@ 提交于 2020-02-09 22:45:36
Description 有n(2 ≤ n ≤ 20)块芯片,有好有坏,已知好芯片比坏芯片多。 每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。 而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。 给出所有芯片的测试结果,问哪些芯片是好芯片。 Input 输入数据第一行为一个整数n,表示芯片个数。 第二行到第n+1行为n*n的一张表,每行n个数据。 表中的每个数据为0或1,在这n行中的第i行第j列(1 ≤ i, j ≤ n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。 Output 按从小到大的顺序输出所有好芯片的编号。 Sample Input 3 1 0 1 0 1 0 1 0 1 Sample Output 1 3 1 #include<stdio.h> 2 int main(){ 3 int n,num=0,a[21][21]; 4 scanf("%d",&n); 5 for(int i=1;i<=n;i++){ 6 for(int j=1;j<=n;j++){ 7 scanf("%d",&a[i][j]); 8 } 9 } 10 for(int i=1;i<=n;i++){ 11 num

蓝桥杯算法训练--指针

蹲街弑〆低调 提交于 2020-02-09 18:55:48
问题描述   你的表妹正在学习整数的加法,请编写一个程序来帮助她学习。该程序调用了一个函数GetTwoInts,由它来返回两个从键盘读入的100以内的整数,然后计算这两个整数之和,并把答案显示出来。要求:在主函数中不能使用scanf等函数直接输入这两个整数,而必须通过调用GetTwoInts函数来完成,在GetTwoInts函数中可以使用scanf函数。另外,由于该函数必须同时返回两个整数,因此不能采用函数返回值的方式,而必须采用指针的方法来实现。   输入格式:输入只有一行,即两个100以内的整数。   输出格式:输出只有一行,即这两个整数之和。 1.int *x,*y声明了指针变量,但声明指针变量时,系统虽然会自动分配一个内存空间给指针变量,但这个内存空间的地址是随机的,这个地址可能指向系统不允许访问的地址或者可用的,但是暂时没有用到的地址(譬如程序没有用到的堆栈地址)等,此时即为野指针。所以,在使用指针变量之前,应该保证指针指向一个绝对可用的空间,即初始化。 2.int a,b声明int型变量时,系统会给变量a,b分配一个可用的内存空间,将变量a,b的地址赋值给指针变量x,y,此时指针变量x,y就可以使用啦~ 也就是指针必须要初始化。 #include<iostream> #include<cmath> #include<cstdio> #include<algorithm>

蓝桥杯——2012年C++A组第3题:海盗比酒量【枚举】

倖福魔咒の 提交于 2020-02-08 20:37:00
一、题目 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。 等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......” 请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。 如果有多个可能的答案,请列出所有答案,每个答案占一行。 格式是:人数,人数,... 例如,有一种可能是:20,5,4,2,0 答案写在“解答.txt”中,不要写在这里! 二、思路 注意看关键的一句话“当第四瓶酒喝下,大家都倒下了。”——意味着只进行了四轮。 还有“船长最后正好喝了一瓶。”——意味着四轮下来船长一共喝了一瓶。 设第一轮有a人,第二轮有b人,第三轮有c人,第四轮有d人。 有1/a+1/b+1/c+1/d=1。 变形得到—— bcd+acd+abd+abc=abcd。 接下来进行枚举就可以得到答案。 注意“不多于20人”,作为循环界限 三、题解 #include <iostream> using namespace std; int main() { for(int a=20;a>=0;a--) { for

蓝桥杯2017-省赛-C/C++-A组8题

。_饼干妹妹 提交于 2020-02-08 18:05:10
题目 标题:包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。 当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。 小明想知道一共有多少种数目是包子大叔凑不出来的。 输入 ---- 第一行包含一个整数N。(1 <= N <= 100) 以下N行每行包含一个整数Ai。(1 <= Ai <= 100) 输出 ---- 一个整数代表答案。如果凑不出的数目有无限多个,输出INF。 例如, 输入: 2 4 5 程序应该输出: 6 再例如, 输入: 2 4 6 程序应该输出: INF 样例解释: 对于样例1,凑不出的数目包括:1, 2, 3, 6, 7, 11。 对于样例2,所有奇数都凑不出来,所以有无限多个。 资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 1000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 注意:

蓝桥杯 1446:[蓝桥杯][2013年第四届真题]核桃的数量 Easy only once *最小公倍数问题

社会主义新天地 提交于 2020-02-08 14:16:07
基本思路: 题解里面很多人都是枚举方法做的,其实是最小公倍数的求法问题; 关键点: 之前做过相关的数学总结,不再赘述,本质上是先求最大公约数,再借助性质求最小公倍数; #include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<cstring> using namespace std; using std::vector; int find_mn(int a, int b) { if (b == 0 && a != 0) return a; else return find_mn(b, a%b); } int count_ln(int a, int b) { int n = find_mn(a, b); if (n == 1) return a * b; else return a * b / n; } int main() { int a, b, c; cin >> a >> b >> c; int temp = 0; if (a > b) temp = count_ln(a, b); else temp = count_ln(b, a); if (temp > c)

(蓝桥杯)分解质因数

落爺英雄遲暮 提交于 2020-02-07 18:30:56
分解质因数 问题描述 求出区间[a,b]中所有整数的质因数分解。 输入格式   输入两个整数a,b。 输出格式   每行输出一个数的分解,形如k=a1 a2 a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例) 样例输入 3 10 样例输出 3=3 4=2 2 5=5 6=2 3 7=7 8=2 2 2 9=3 3 10=2 5 分析 一开始想的是先找出所有的素数,然后将这些素数一个个带入,用输入数据一次除这些素数,最后得到要求的因数。写完程序,代入系统,结果又超时了,运行超时是真的烦。本着不能浪费的原则,我这里还是贴出来看一看,毕竟能出结果的,就是慢了点,大家看看思路也还行。 质因数分解代码(超时) # include <iostream> using namespace std ; int k [ 10000 ] ; int jj [ 10000 ] ; int shuru [ 10000 ] ; int main ( ) { int a , b ; cin >> a >> b ; for ( int i = 0 ; i < b - a + 1 ; i ++ ) { shuru [ i ] = a + i ; } int n = 2 ; k [ 0 ] = 2 ; k [ 1 ] = 3 ; //筛选出范围内所有的素数 for ( int i = 2 ; i <=

[蓝桥杯][算法提高]数组输出

亡梦爱人 提交于 2020-02-07 11:19:24
时间限制: 1Sec 内存限制: 128MB 题目描述 输入一个3行4列的数组,找出该数组中绝对值最大的元素、输出该元素及其两个下标值。如有多个输出行号最小的,还有多个的话输出列号最小的。 输入 无 输出 无 样例输入 1 2 3 5 -2 5 8 9 6 -7 5 3 样例输出 9 2 4 C语言代码: # include <stdio.h> double myabs ( double a ) ; int main ( void ) { double a [ 3 ] [ 4 ] ; double tmp ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 4 ; j ++ ) { scanf ( "%lf" , & a [ i ] [ j ] ) ; } } tmp = a [ 0 ] [ 0 ] ; int x , y ; for ( int i = 2 ; i >= 0 ; i -- ) { for ( int j = 3 ; j >= 0 ; j -- ) { if ( myabs ( a [ i ] [ j ] ) >= myabs ( tmp ) ) { tmp = a [ i ] [ j ] ; x = i ; y = j ; } } } printf ( "%g %d %d" , myabs ( a