(1) P1001 A+B Problem
入门题,这题估计只是为了让大家熟悉洛谷这个平台吧!题目给定数据范围|a|,|b|都小于10e9,所以用int即可,因为int可以储存的最大值是2147483647,就是2*10e9多一点。如果题目数据稍微再大一点,就要用long来存储了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt(),b=sc.nextInt();
System.out.println(a+b);
}
}
(2) P1000 超级玛丽游戏
做这道题我就想起来上小学时的罚抄,也是这样无聊。我看题解有的大佬还是根据马里奥的头部身体分别写了几个函数(这是有多无聊,直接复制粘贴它不香嘛!)这道题就算单纯的打印图形,细心一点就是啦。注意提交代码的时候不要带package,主类名要改为Main,我做这道题的时候忘记改了导致编译错误。
public class Main {
public static void main(String[] args) {
System.out.println(" ********");
System.out.println(" ************");
System.out.println(" ####....#.");
System.out.println(" #..###.....##....");
System.out.println(" ###.......###### ### ###");
System.out.println(" ........... #...# #...#");
System.out.println(" ##*####### #.#.# #.#.#");
System.out.println(" ####*******###### #.#.# #.#.#");
System.out.println(" ...#***.****.*###.... #...# #...#");
System.out.println(" ....**********##..... ### ###");
System.out.println(" ....**** *****....");
System.out.println(" #### ####");
System.out.println(" ###### ######");
System.out.println("##############################################################");
System.out.println("#...#......#.##...#......#.##...#......#.##------------------#");
System.out.println("###########################################------------------#");
System.out.println("#..#....#....##..#....#....##..#....#....#####################");
System.out.println("########################################## #----------#");
System.out.println("#.....#......##.....#......##.....#......# #----------#");
System.out.println("########################################## #----------#");
System.out.println("#.#..#....#..##.#..#....#..##.#..#....#..# #----------#");
System.out.println("########################################## ############");
}
}
(3)P5703 【深基2.例5】苹果采购
emmm,这道题的名字我觉得叫错了。这道题应该和A*B problem,明明和第一题一样嘛,连数据规模都还是10e9.但它还是没有设坑,两个10e9乘的话按理要用long来存的,但用int还是可以过,因为这题数据没那么大。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt(),b=sc.nextInt();
System.out.println(a*b);
}
}
(4) P5704 【深基2.例6】字母转换
这题有两种解法:
第一种:如果你所用的语言有自动转换的函数可以直接调用API来进行大小写转换。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println(sc.nextLine().toUpperCase());
}
}
第二种:如果没有的话,如果看过ASCII码的同学都知道,小写字母-32=大写字母,这样也可以得出答案。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println((char)(sc.nextLine().charAt(0)-32));
}
}
(5) P5705 【深基2.例7】数字反转
三种解法:
第一种,这道题虽然是数字反转,其实可以看作字符串来处理。直接调用语言自带的反转函数就可以啦。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//调用StringBuilder的reverse函数反转
System.out.println(new StringBuilder(sc.nextLine()).reverse());
}
}
第二种,如果有些语言并没有反转函数,其实实现起来也不难,建立一个新的字符串,首字符等于原字符串最后一位,第二个字符等于原字符倒数第二位… 用一个for循环就可以搞定。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
StringBuilder sb=new StringBuilder();
for(int i=s.length()-1;i>=0;i--) {
sb.append(s.charAt(i));
}
System.out.println(sb);
}
}
第三种,如果你不想用字符串。因为这题说明了小数点后面只有一位,整数部分也是一个3位数,完全就可以只把小数和整数拆开,只对整数做反转,然后输出时候把小数加在前面。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double x=sc.nextDouble();
int a=(int)x; //获得整数部分
int b=(int)(x*10)%10; //获得小数位
int c=0;
while(a>0) {
c=c*10+a%10;
a/=10;
}
System.out.println(b+"."+c);
}
}
(6) P5706 【深基2.例8】再分肥宅水
这题可以叫做一个A/B问题,还是和之前A*B,A+B一样,但不同的地方在于它是一个浮点数,要保留3位小数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double a=sc.nextDouble();
int b=sc.nextInt();
System.out.println(String.format("%.3f", a/b));
System.out.println(b*2);
}
}
(7) P1425 小鱼的游泳时间
又来了个A-B问题,四则运算都被凑齐了,这题就是两个时间差相减即可,如果分钟不够,要向时借一位。另外,1小时等于60分钟,不要写成100了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt(),d=sc.nextInt();
if(d<b) { //如果分钟要向时借一位
System.out.println(c-1-a+" "+(d+60-b));
}
else {
System.out.println(c-a+" "+(d-b));
}
}
}
(8) P1421 小玉买文具
这道题用小玉所有的钱除单价就可以得到能买的最多的数量啦。另外我们要知道如果钱数不足买一只笔是要向下取整的,刚好计算机中的整型除法满足这一点,所以我们把金额转换成角来计算,即1元等于10角。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt(),b=sc.nextInt();
System.out.println((a*10+b)/19);
}
}
(9) 深基2.习6】Apples Prologue
这题和上题有点相反,上题是向下取整,这题是要向上取整,因为题目要求输出完整的苹果数,也就是说,一个苹果吃到一半了它也不算完整的苹果。但int类型不会向上取整,所以我们要判断一下,如果有一个苹果吃到一半了,那么苹果数再减1。这题还有个小坑,就是说如果苹果不够吃了,那么就特判下输出0。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt(),t=sc.nextInt(),s=sc.nextInt();
int apple;
if(s%t!=0) { //如果有苹果吃到一半
apple=m-s/t-1;
}
else {
apple=m-s/t;
}
if(apple<0) { //如果苹果不够吃了
System.out.println(0);
}
else {
System.out.println(apple);
}
}
}
(10)P2181 对角线
这道题考查组合数学的知识,题目说明了不会有三条对角线交于一点。那么过一个交点只会有两条对角线,而两条对角线是由4个顶点组成的。所以这道题就是问,这个n边形可以转换为多少个4边形,也就是说在这个n边形种任意取4个点,有多少种情况?根据排列组合我们得出公式
C
n
4
C_n^4
Cn4 ,所以得出O(1)复杂度的公式:n*(n-1)(n-2)(n-3)/24
这里的数据大小java是肯定会溢出的,所以要用高精度。而c++有long long类型,可以洛谷有大佬利用一些技巧使得数据不会溢出。
n*(n-1)是2的倍数,n*(n-1)(n-2)是3的倍速,所以可以将上述公式拆分成
n(n-1)/2*(n-2)/3*(n-3)/4
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
BigInteger n=sc.nextBigInteger();
BigInteger a=new BigInteger("1");
for(int i=0;i<4;i++) {
BigInteger b=new BigInteger(i+"");
a=a.multiply(n.subtract(b));
}
a=a.divide(new BigInteger(24+""));
System.out.println(a);
}
}