SMU Winter 2023 Round #12 (Div.2)

A.KK画猪

题目:

输入pig,输出一些字符。

代码:

点击查看代码
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String s = scanner.next();
		System.out.println("  (\\____/)\r\n"
				+ "  / @__@ \\\r\n"
				+ " (  (oo)  )\r\n"
				+ "  `-.~~.-'\r\n"
				+ "   /    \\\r\n"
				+ " @/      \\_\r\n"
				+ "(/ /    \\ \\)\r\n"
				+ " WW`----'WW\r\n"
				+ "");
	}
}

B.KK学几何

题意:

已知 kk 会考你三种图形,分别是圆,三角形和矩形,分别用 "1","2","3" 来表示三种图形:

如果是 1,则会告诉你圆的半径 r。
如果是 2,则会告诉你三角形的底 L 和高 h。
如果是 3,则会告诉你矩形的长 L 和宽 W。
现在希望你把 kk 给你的所有图形的面积累加起来,并保留 1 位小数。

并且我们约定 π=3。

思路:

按照题意求解即可

代码:

点击查看代码
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		float sum = 0;
		while(n-->0) {
			int select = scanner.nextInt();
			float s = 0;
			if(select == 1) {
				int r = scanner.nextInt();
				s = 3*r*r;
				sum += s;
			}else if(select == 2) {
				int L = scanner.nextInt();
				int h = scanner.nextInt();
				s = (float)L*h/2;
				sum += s;
			}else if(select == 3) {
				int L = scanner.nextInt();
				int W = scanner.nextInt();
				s = L*W;
				sum += s;
			}
		}
		System.out.printf("%.1f",sum);
	}
}

C.KK 看跳舞

题意:

给一个数组,里面有1~n,n个数不重复,让最后一个数和第一个数相连,判断是不是顺时针或者逆时针,是就输出YES,不是就输出NO。

思路:

首先我想到的是用两个相同顺时针或者逆时针的字符串判断是否包含该数组转化成的字符串来判断。但是会超时。
后面得到规律:顺时针或者逆时针的时候两个数只可能相差 1 或者 n-1,且只有1 和 n之间会是这种差值。其他的情况就不满足条件了。

代码:

点击查看代码
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int T = scanner.nextInt();
		while(T-->0) {
			int n = scanner.nextInt();
			int[] arr = new int[n];
			for(int i = 0;i < n;i++) {
				arr[i] = scanner.nextInt();
			}
			boolean flag = true;
			for(int i = 0;i < n-1;i++) {
				if(Math.abs(arr[i]-arr[i+1])==1) {
				}else if(Math.abs(arr[i]-arr[i+1])==n-1&&arr[i+1]==n){
				}else {
					flag = false;
					break;
				}
			}
			if(flag) {
				System.out.println("YES");
			}else {
				System.out.println("NO");
			}
		}
	}
}

D.KK与十佳

题意:

在一组数里面找到一个数,使得其他数的乘积为最大,输出这个数。

思路:

这个题需要分类讨论一下,最后结果的大小与数的正负,以及负数的个数是有关的。
如果全部是正数的话,那么就是去掉最小的正数即可;
如果全部是负数的话,就要分两种情况了,如果是奇数个负数,那么去掉这个数之后就剩偶数个负数,最后乘积为正,所以绝对值上就要尽量大,就去掉最大的那个负数,例如-3,-2,-1,去掉-1;如果是偶数个负数的话,去掉一个后,最后得到的结果是负数,所以绝对值上就要尽量大,就去掉最小的负数,例如 -3,-2,-1,去掉-3.
如果是偶数个负数加上n个正数(正数多少不影响),就不要去掉负数,不然会使结果为负,去掉最小的正数即可。
如果是奇数个负数加上n个正数,就去掉绝对值最小的负数即可,与上面那个全负且奇的情况一样。

代码:

点击查看代码
import java.util.Arrays;
import java.util.Scanner;
public class MainH {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] arr = new int[n+1];
		int[] arr1 = new int[n+1];
		int[] arr2 = new int[n+1];
		int a = 1,b = 1;
		int pos = 0;
		int nag = 0;
		for(int i = 1;i <= n;i++) {
			arr[i] = scanner.nextInt();
			if(arr[i]>0) {
				arr1[a++] = arr[i]; 
			}else {
				arr2[b++] = arr[i];
			}
		}
		Arrays.sort(arr1,1,a);
		Arrays.sort(arr2,1,b);
		if(b==1) {
			System.out.println(arr1[1]);
		}else if(b>1&&(b-1)%2==0) {
			if(a==1) {
				System.out.println(arr2[1]);				
			}else {
				System.out.println(arr1[1]); //偶数个负数且有正数的情况下千万不要动负数,不然最后为负
			}
		}else if(b>1&&(b-1)%2==1) {
			System.out.println(arr2[b-1]);
		}
	}
}

E.KK 买股票

题意:

在一组数中找到两个数满足顺序对,且差值最大,求这个差值。

思路:

最开始想的是一对一对减,求最大值,但是会超时,后面找到了另一种方法。
首先我们找到最大值和最小值,如果这两个数是非逆序的,那么就是最大的差值。如果是逆序的,就从最大值向前找前面的最小值,最小值向后找后面的最大值,找出来求差值并比较大小,将较大差值选出来作为最大值。

代码:

点击查看代码
import java.util.Scanner;
public class MainI {
	static int arr[];
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		arr = new int[n];
		int mini=0,min = 1000;
		int maxi=0,max = 0;
		for(int i = 0;i < n;i++) {
			arr[i] = scanner.nextInt();
			if(arr[i]>max) {
				max = arr[i];
				maxi = i;
			}
			if(arr[i]<min) {
				min = arr[i];
				mini = i;
			}
		}
		max = findmax(mini,maxi);
		System.out.println(max);
		
	}
	public static int findmax(int mini,int maxi) {
		if(maxi>=mini) return arr[maxi]-arr[mini];
		if(maxi==mini) return 0;
		int max = 0;
		int min = 1000;
		int l = mini;
		int r = maxi;
		for(int i = 0;i <= r;i++) {
			if(arr[i]<min) {
				min = arr[i];
				mini = i;
			}
		}
		for(int i = l;i < arr.length;i++) {
			if(arr[i]>max) {
				max = arr[i];
				maxi = i;
			}
		}
		return Math.max(findmax(l,maxi), findmax(mini,r));
	}
}

F.KK学英语

题意:

给出一个字符串,将里面单独的" is " 全部换成" was ",最后行末不能有空格。

思路:

直接使用字符串的replace函数,再用trim()函数去掉无用空格,但注意就是" is is "的情况中用replace方法只会替换前面一个,一直不知道怎么办。后面就是连续用了两次replace函数就成功了。第一次可能因为空格原因只替换了一个,后面的话之前的" is "全部变成" was "了,就不会影响第二次的替换了。

代码:

点击查看代码
import java.util.Scanner;
public class MainJ {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String str = scanner.nextLine();
		String str1 = "";
		str1 = str.replace(" is ", " was ");
		str1 = str1.replace(" is ", " was ");
		str1 = str1.trim();
		System.out.println(str1);
	}
}

posted @ 2023-02-16 22:40  Tcoo  阅读(49)  评论(0)    收藏  举报