洛谷试炼场 DAY 01
前言
在网上看到说,蓝桥杯的比赛形式和洛谷相似。这就尴尬了啊,之前一直在力扣上努力,虽然都是刷题,但是刷题的形式还是有一点不同的。洛谷上的coding环境更类似于算法竞赛。所以吧,洛谷试炼场 DAY 01 开始
01.超级玛丽游戏
题目描述
超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景
原题目链接:洛谷P1000 超级玛丽游戏
(该说不说,看到这个字符画莫名想起B站上有字符画动漫人物的视频hhh)
思路
这道题是洛谷的零号题(欢迎新手~),用字符的组合画出想要的图画,这道题还是非常简单的,需要注意的就是换行。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println(" ********\r\n" +
" ************\r\n" +
" ####....#.\r\n" +
" #..###.....##....\r\n" +
" ###.......###### ### ###\r\n" +
" ........... #...# #...#\r\n" +
" ##*####### #.#.# #.#.#\r\n" +
" ####*******###### #.#.# #.#.#\r\n" +
" ...#***.****.*###.... #...# #...#\r\n" +
" ....**********##..... ### ###\r\n" +
" ....**** *****....\r\n" +
" #### ####\r\n" +
" ###### ######\r\n" +
"##############################################################\r\n" +
"#...#......#.##...#......#.##...#......#.##------------------#\r\n" +
"###########################################------------------#\r\n" +
"#..#....#....##..#....#....##..#....#....#####################\r\n" +
"########################################## #----------#\r\n" +
"#.....#......##.....#......##.....#......# #----------#\r\n" +
"########################################## #----------#\r\n" +
"#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\r\n" +
"########################################## ############");
}
}
02.A+B Problem
题目描述
输入两个整数,输出它们的和
(这道题可以说是所有OJ系统的一号题目了,非常经典,也非常简单。它的作用更多是让新手菜鸟熟悉代码格式和输入输出格式)
原题目链接:洛谷P1001 A+B Problem
PS.这道题的思路就省略了---
代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
System.out.println(a+b);
}
}
03.苹果采购
题目描述
现在需要采购一些苹果,每名同学都可以分到固定数量的苹果,并且已经知道了同学的数量,请问需要采购多少个苹果?(输入两个正整数,分别代表每人分到的数量和同学人数)
原题目链接:[洛谷P5703 苹果采购](P5703 【深基2.例5】苹果采购 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
(这道题也是挺简单的说,上一道题是算加法,这道题算的就是乘法,同样的这道题的目的是提高新手菜鸟对提交格式的熟悉,思路同样省略了---)
代码
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
BigInteger ans = BigInteger.valueOf(a*b);
System.out.print(ans);
}
}
注意:这里的答案我采取的是BigInteger类型,目的是防止答案内存溢出。
04.字母转换
题目描述
输入一个小写字母,输出其对应的大写字母。例如输入q时,会输出Q。
原题目链接:洛谷P5704 字母转换
思路
字母转换也是每个OJ系统的经典题目了,非常简单,核心是使用ASCLL码计算进行大小写的转换,在Java中我们可以使用强制数据转换。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = in.next();
char i = a.charAt(0);
int b = (int)i - 32;
char ans = (char)b;
System.out.print(ans);
}
}
05.数字反转
题目描述
输入一个不小于100且小于1000,同时包括小数点后一位的一个浮点数,例如123.4,要求把这个数字翻转过来,变成4.321并输出。
原题目链接:洛谷P5705 数字翻转
思路
从这道题开始,就有点意思了。题目中除了翻转外,还有一个重要信息,就是输入是不小于100且小于1000同时包括小数点后一位的浮点数,换句话说,输入有四位有效数字。
一开始对这道题,我的想法是将输入的每一位都输入到一个数组中,然后用另外一个数组来存放翻转后的答案,最后输出。虽然说这个思路有点麻烦,但是也算是常规。一般情况下(例如力扣中),是有严格返回类型限定的,以题目为例,可能就是限定一个浮点的返回类型。
但是!!!在洛谷中(或者说在算法竞赛中),比对的是最后的输出结果,,也就是说只要最后的输出结果和答案一样,并不限制输出的格式问题!(这样的话,这道题就有一个很骚的做法了,具体请看下面代码)
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
for (int i = s.length()-1; i >= 0; i--) {
System.out.print(s.charAt(i));
}
in.close();
}
}
骚点:在本行倒序输出字符串内容,与答案一致,本题AC!!!!
06.再分肥仔水
题目描述
现在有 t 毫升肥宅快乐水,要均分给 n 名同学。每名同学需要 2 个杯子。现在想知道每名同学可以获得多少毫升饮料(严格精确到小数点后 3 位),以及一共需要多少个杯子。输入一个实数 t 和一个整数 n,使用空格隔开。输出两个数字表示答案,使用换行隔开。
原题目链接:洛谷P5706 再分肥仔水
思路
这道题的思路还是比较清晰的,主要还是考察除法中小数点位问题,我回顾了一下Java中对于小数点位控制的几个方法。(可能后续会写一下发个博客~)
代码
import java.text.DecimalFormat;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
double t = in.nextDouble();
int n = in.nextInt();
DecimalFormat dfDecimalFormat = new DecimalFormat("0.000");
System.out.println(dfDecimalFormat.format(t/n));
System.out.println(n*2);
}
}
注意点:这里我采用的是DecmalFormat方法,这种方法当时学Java的时候没有学到过,所以这里也算是查漏补缺一下了。
07.小鱼游泳时间
题目描述
奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。
这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自己从a时b分一直游泳到当天的c时d分,请你帮小鱼计算一下,它这天一共游了多少时间呢?
小鱼游的好辛苦呀,你可不要算错了哦(出题人实属恶趣味,题目描述还能这么出是我没想到的)
输出 2 个整数 e 和 f,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 f 应该小于60。
原题目链接:洛谷P1425 小鱼游泳时间
思路
这道题的关键是在单位的换算计算,以及可能出现的内存溢出问题,单纯用整数类型是无法AC的,所以我在代码实现中使用了长整数类型。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int startHour = in.nextInt();
int startMin = in.nextInt();
int endHour = in.nextInt();
int endMin = in.nextInt();
long startTime = startHour*60 + startMin;
long endTime = endHour*60 + endMin;
long ans = endTime-startTime;
int min = (int) (ans%60);
int hour = (int) (ans-min)/60;
System.out.println(hour + " " + min);
in.close();
}
}
PS:很蠢的一种写法,不够简洁漂亮,anyway,我AC就好了!
后言
洛谷的提交和力扣的提交有很多的不同。
- 洛谷的在线IDE中是完全空白的,所有都要自己写,所以我一般会在本地的eclipse上写一遍运行一下,再提交测评。
- 提交的主类名必须是Main,如果是其他的就会编译错误,这里和力扣里面的自带类名是不一样的。
- 洛谷中的输出一般都是打印出来于标准答案对比,对格式没有严格的限制。而在力扣中要求的是返回值,而且返回格式有严格要求。这个区别就导致洛谷中的一些题目可以有骚气一点的解法。