洛谷试炼场 DAY 01

洛谷试炼场 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就好了!

后言

洛谷的提交和力扣的提交有很多的不同。

  1. 洛谷的在线IDE中是完全空白的,所有都要自己写,所以我一般会在本地的eclipse上写一遍运行一下,再提交测评。
  2. 提交的主类名必须是Main,如果是其他的就会编译错误,这里和力扣里面的自带类名是不一样的。
  3. 洛谷中的输出一般都是打印出来于标准答案对比,对格式没有严格的限制。而在力扣中要求的是返回值,而且返回格式有严格要求。这个区别就导致洛谷中的一些题目可以有骚气一点的解法。
上一篇:0位运算中等 LeetCode89. 格雷编码


下一篇:一个资深程序员看12306 (三)