蓝桥杯 算法训练(2)
1.算法训练 Anagrams问题
输入格式:输入有两行,分别为两个单词。
输出格式:输出只有一个字母Y或N,分别表示Yes和No。
输入输出样例
Nuclear
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);String s1 = input.next();String s2 = input.next();s1 = s1.toUpperCase();s2 = s2.toUpperCase();int []f = new int[26];int []k = new int[26];if(s1.length() == s2.length()){for(int i = 0;i < s1.length();i++){f[s1.charAt(i)-65] ++;k[s2.charAt(i)-65] ++;}int j;for(j = 0;j < 26;j++){if(f[j] != k[j]){System.out.println("N");break;}}if(j == 26)System.out.println("Y");}elseSystem.out.println("N"); }}
将两个字符串利用s1 = s1.toUpperCase();s2 = s2.toUpperCase();全部转化成大写的形式这样好做判断,如果两个字符串长度不相等,则肯定输出N;如果两个字符串长度相等,分别对应构建两个数组,每个数组有0~25个元素,使用f[s1.charAt(i)-65];k[s2.charAt(i)-65]依次对应从A到Z的出现次数,最后通过f[i]与k[i]的对比,如果数值不相等,则输出N,使用break跳出整个for循环不用再进行后续的比较;如果数值相等,那么输出Y的语句肯定不能放在for循环之内,否则会重复输出,我们只需要最后进行判断,看是否完成了所有的for循环操作,如果全部完成,此时j==26,也就是说这两个数组26个数值都对应相等,输出Y。
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);String s1 = input.next();String s2 = input.next();s1 = s1.toLowerCase();s2 = s2.toLowerCase();char []c1 = s1.toCharArray();char []c2 = s2.toCharArray();Arrays.sort(c1);Arrays.sort(c2);if(Arrays.equals(c1, c2))System.out.println("Y");elseSystem.out.println("N");}}
第二种方法占用的内存比第一种方法要大,利用toCharArray()将两个都转化为小写的字符串转化为数组,利用Arrays.sort()对数组进行排序,直接利用Arrays.equals(c1, c2)比较排序后的两个数组元素是否对应相等。
2.算法训练 前缀表达式
输入格式:输入只有一行,即一个前缀表达式字符串。
输出格式:输出相应的计算结果(如果是除法,直接采用c语言的“/”运算符,结果为整数)。
输入输出样例
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);String []s = new String[3];for(int i = 0;i < 3;i++){s[i] = input.next();}int a = Integer.parseInt(s[1]);int b = Integer.parseInt(s[2]);switch(s[0]){case "+" :System.out.println(Add(a,b));break;case "-":System.out.println(Subtraction(a,b));break;case "*" :System.out.println(Multiply(a,b));break;case "/":System.out.println(Division(a,b));break;default:break;}}private static int Division(int a,int b) {// TODO Auto-generated method stubreturn a / b;}private static int Multiply(int a,int b) {// TODO Auto-generated method stubreturn a * b;}private static int Subtraction(int a,int b) {// TODO Auto-generated method stubreturn a - b;}private static int Add(int a,int b) {// TODO Auto-generated method stubreturn a + b;}}
在这个题目上花费的时间主要是在字符串和数组上面,在这里不能输入字符串后再利用toCharArray()的方法转化为数组,因为我们输入字符串的时候要求中间有空格,而空格占用一个数组中的元素,容易发生错误,当然也可以采用Sring.splite(" ")方法在空格处将字符串分割存储为数组,这样有点儿麻烦,而且不是很容易能想到。所以应该直接建立一个String类型的字符串数组,可以避免空格的问题,这样输入三个元素即为该数组的三个元素。
利用Integer.parseInt(s[1])将String类型转化为int整型进行下面的运算操作。
3.算法训练 2的次幂表示
将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();fun(n);}private static void fun(int n) {// TODO Auto-generated method stubString s = Integer.toBinaryString(n);int []f = new int[s.length()];int k = 0;for(int i = 0;i < s.length();i++){if(s.charAt(i) == '1'){f[k] = s.length()-i-1;k++;}}for(int i = 0;i < k;i++){if(f[i] == 0)System.out.print("2(0)");else if(f[i] == 1)System.out.print("2");else if(f[i] == 2)System.out.print("2(2)");else if(f[i] > 2){System.out.print("2(");fun(f[i]);System.out.print(")");}if(i != k-1)System.out.print("+");}}}
构造fun()方法进行递归,先使用String s = Integer.toBinaryString(n);将十进制转化为二进制形式,构造一个数组f[k]用来存放二进制位数为1时所对应的幂次,当幂次为0时,直接输出2(0),当幂次为1时,直接输出2,当幂次为2时,直接输出2(2),当幂次大于2时,此时需要将该幂次转化成二进制数形式,重复上面的步骤,所以再次调用fun()方法。
注意“+"的添加,为避免重复输出,必须加一个条件i!=k-1,当i==k-1时,for循环完成,不需要再添加加号。
4.算法训练 排序
输入格式:输入只有一行,即三个整数,中间用空格隔开。
输出格式:输出只有一行,即排序后的结果。
输入输出样例
这个排序比较简单,直接
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int []f = new int[3];for(int i = 0;i < 3;i++)f[i] = input.nextInt();for(int i = 0;i < 3;i++){for(int j = i+1;j < 3;j++){if(f[i] < f[j]){int temp;temp = f[i];f[i] = f[j];f[j] = temp;}}}for(int i = 0;i < 3;i++){System.out.print(f[i] + " "); }}
}
这个排序比较简单,用冒泡排序就可以解决。考察for嵌套循环的使用
5.算法训练 图形显示
* * * * *
* * * *
* * *
* *
*
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();for(int i = 0; i < n;i++){for(int j = n-i ;j>0;j--){System.out.print("*" + " ");}System.out.println("");}}
}
考察for嵌套循环,比较简单。
6.算法训练 最大的算式
N=5,K=2,5个数字分别为1、2、3、4、5,可以加成:
1*2*(3+4+5)=24
1*(2+3)*(4+5)=45
(1*2+3)*(4+5)=45
……
1 2 3 4 5
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();int k = input.nextInt();long []f = new long[16];for(int i = 0;i < n; i++){f[i] = input.nextInt(); }long []sum = new long[16];sum[0] = 0;for(int i = 1;i <= n;i++){sum[i] = sum[i-1]+f[i-1];}long [][]dp = new long[16][16]; for(int i = 1;i <= n;i++){dp[i][0] = sum[i];}for(int i = 2;i <= n;i++){int t = Math.min(i-1, k);for(int j = 1;j <= t;j++){for(int h = 2;h <= i;h++){long temp = sum[i]-sum[h-1];dp[i][j] = Math.max(dp[i][j], dp[h-1][j-1]*temp);}}}System.out.print(dp[n][k]);}}
采用动态规划,不用考虑括号,只从乘号来考虑,设dp[i][j]表示前i个数中有j个乘号的最大结果,sum[i]表示前i个数的总和
当乘号个数为0时,最大算式的值即为前i个数的和,所以直接令dp[i][0]=sum[i];
自顶向下计算前i个元素的算式最大值,i最少有2个,且小于等于n;
j表示前i个元素中有j个乘号,即为乘号的个数,之前乘号为0时已经讨论过了,所以直接令j=1,而乘号的个数不仅最大只能取到i-1个要小于数的数量,而且j不应该超过我们所输入的k值,即j<=k
h表示最后一个乘号的位置,应该从2开始,且最大取到i(插空),假如乘号在第h个位置,那么此时dp[i][j]就是前h-1个数有j-1个乘号的最大值乘以第h个数到j个数的和,再将之前求出的dp[i][j]比较大小,取最大值,因为h位置已经是最后一个乘号的情况,所以dp[h-1][j-1]已经表示前k-1个数j-1个乘号的最大值,直接乘以剩余的数之和就可以了。
得出状态转移方程dp[i][j] = Math.max(dp[i][j], dp[h-1][j-1]*(sum[i]-sum[h-1]));
最最重要的是我一开始设置的三个数组最大为15,编译结果为55分,将三个均改为16之后编译结果正确,一定要注意所允许的数据的范围从而确定好数组的最大长度,否则编译出错,不容易觉察出来,在这里浪费了太长时间,哎。
dp[1][0] = 1
dp[2][0] = 1+2 dp[2][1] = 1*2 = dp[1][0]*2
dp[3][0] = 1+2+3 dp[3][1] = (1+2)*3 =dp[2][0] *3 dp[3][2] = 1*2*3 = dp[2][1]*3
dp[4][0] = 1+2+3+4 dp[4][1] = (1+2+3)*4 = dp[3][0]*4 dp[4][2] = (1+2)*3*4 = dp[3][2]*4
dp[5][0] = 1+2+3+4+5 dp[5][1] = (1+2+3+4)*5 = dp[4][0]*5 dp[5][2] = (1+2+3)*4*5 = dp[4][1]*5
7.算法训练 未名湖边的烦恼
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
问题分析
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int m = input.nextInt();int n = input.nextInt();System.out.println(fun(m,n));}private static int fun(int m, int n) {// TODO Auto-generated method stubif(m < n)return 0;if(n == 0)return 1;elsereturn fun(m-1,n)+fun(m,n-1);}}
采用递归思想,构造fun()方法,当借的人数大于还的人数的时候,没有办法满足,当全部都是还鞋的时候就只有一种排法;除了上面两种特殊情况,正常情况下,先安排第一个排队的人,分为两种情况,一个是还鞋的,一个是借鞋的,然后再对剩下的m+n-1人再进行如上判断return fun(m-1,n)+fun(m,n-1);
8.算法训练 数字三角形
径,使该路径所经过的数字的总和最大。
●每一步可沿左斜线向下或右斜线向下走;
●1<三角形行数≤100;
●三角形中的数字为整数0,1,…99;
.
(图3.1-1)
接下来描述整个三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input = new Scanner(System.in);int n = input.nextInt();int [][]f = new int[101][101];for(int i = 0;i < n;i++){for(int j = 0;j <= i;j++){f[i][j] = input.nextInt();}}for(int i = n-1;i >= 0;i--){for(int j = 0;j < i;j++){f[i-1][j] += Math.max(f[i][j], f[i][j+1]);}}System.out.println(f[0][0]); }
}
运用了典型的动态规划的思想:从倒数第2层开始,一层一层向上遍历。倒数第2层第一个节点为2,必定会选择5,此时用2+5=7代替原来的2,同理用7+5=12代替7,4+6=10代替4,4+6=10代替4......
在这里需要注意的是:在存储二维数组的过程中,要保证j <= i的限制条件,而不应该是j<n,否则其余未输入的部分,默认为0值,虽然编译成功,但不会输出任何的结果。
9.算法训练 Cowboys
10.算法训练 P1103
编程实现两个复数的运算。设有两个复数 和 ,则他们的运算公式为:
要求:(1)定义一个结构体类型来描述复数。
(2)复数之间的加法、减法、乘法和除法分别用不用的函数来实现。
(3)必须使用结构体指针的方法把函数的计算结果返回。
说明:用户输入:运算符号(+,-,*,/) a b c d.
输出:a+bi,输出时不管a,b是小于0或等于0都按该格式输出,输出时a,b都保留两位。
输入:
- 2.5 3.6 1.5 4.9
输出:
1.00+-1.30i
蓝桥杯 算法训练(2)相关推荐
- 蓝桥杯 算法训练 幸运的店家
蓝桥杯 算法训练 幸运的店家 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 炫炫开了一家商店,卖的货只有一个,XXX,XXX卖N元钱.有趣的是,世界上只有面值为3的幂的纸 ...
- 蓝桥杯 算法训练 Beaver's Calculator
蓝桥杯 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...
- 蓝桥杯 算法训练 印章
蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...
- 蓝桥杯算法训练-24点(Python)
问题描述 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24, ...
- 蓝桥杯——算法训练——数字三角形
蓝桥杯--算法训练--数字三角形 这道题不难,但是比较典型,可以作为动态规划(dp)的入门篇,属于线性dp(LIS,LCS和数字三角形都是此类题型). ------------------------ ...
- 蓝桥杯算法训练-强力党逗志芃
持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀 题目 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 ...
- 蓝桥杯 算法训练 逗志芃的危机
蓝桥杯 算法训练 逗志芃的危机 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃又一次面临了危机.逗志芃的妹子是个聪明绝顶的人,相比之下逗志芃就很菜了.现在她妹子要和 ...
- 蓝桥杯算法训练-过河马
蓝桥杯算法训练题解有兴趣的可以支持下. 题目 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后,这匹马表示它不开心了-- 于是,终于有一天,它也过河了! 由于过河马积累了许多的怨念 ...
- 蓝桥杯——算法训练——进击的青蛙
问题描述 青蛙X正准备跳过一座桥,这座桥被划分为N段,记青蛙所在的起始点为0,桥的末端为N.桥上的一些点有一些石子,这些点是无法跳上去的.青蛙每次跳跃能向前跳跃+1,+2,+3段,现在请你算出跳到末端 ...
- 蓝桥杯算法训练合集十三 1.P06022.P07033.逗志芃的危机4.唯一的小可爱5.JOE的矩阵
目录 1.P0602 2.P0703 3.逗志芃的危机 4.唯一的傻子 5.JOE的矩阵 1.P0602 问题描述 编写一个程序,输入一个4位的自然数,将组成该数的各位数字重新排列,形成一个最大数和一 ...
最新文章
- vs连接mysql建一个表并增删查改_VS连接SQL Server数据库,增删改查详细教程(C#代码)...
- 使用startForeground让android服务前台运行
- PHP之提取多维数组指定列的方法
- 绝地求生信号枪只能在服务器吗,绝地求生信号枪怎么用?信号枪刷新点及用法详解...
- gis python 桌面,arc-utils-用于Esri ArcGIS桌面软件的Python实用程序-Grant Herbert
- opengl源码 实现无缝切换图片过场_OpenGL学习笔记(六)变换
- VOSviewer | (一)从零安装教程
- 中国移动CMPP接口
- 360手机助手下载|360手机助手下载
- linux命令 sys,用syslinux引导多个linux系统
- 业务流程优化的三点思考
- 2013房价必然拉开大崩溃的序幕
- Windows10下的FPN_TensorFlow复现
- 利用 Matlab Simulink 平台搭建双馈风力发电机在电网中的模型
- 校园IPTV数字电视教学直播系统方案-淮安生态文旅区实验小学
- 论如何进行培养独立解决问题的能力
- ubuntu安装nginx安装依赖报错Unable to locate package zlib
- android_基础_Edittext的setSelection属性
- Windows Phone 7芒果更新
- word转pdf时图片错误的解决办法(转)
热门文章
- load 和 loads的区别
- 用switch排两个数大小C语言,关于C语言Switch语句,先学这些技巧够不够?
- 安装Ubuntu13.10 必做的事情 - Saucy Salamander(活泼的蝾螈)
- 【电气专业知识问答】问:调节器用TV熔丝熔断后的现象是什么?如何分析与处理?
- 无线倾角报警仪 NB-lot和lora无线倾角仪隧道监测预警
- 华为鸿蒙智慧屏测评,华为智慧屏SE系列评测:从用上到爱上 就是一“眼”之间...
- 2020.11.28-29全国高校大数据专业教学研讨与教师培训会议
- 【自然语言处理(NLP)】基于SQuAD的机器阅读理解
- 【每日一题】美国节日(基姆拉尔森公式、蔡勒公式)
- 针对某网站的SEO评测报告