首页 > 其他分享 >SMU冬训营第三周周一

SMU冬训营第三周周一

时间:2023-01-20 21:11:26浏览次数:54  
标签:arr scanner int SMU 冬训 第三周 ++ sum Scanner

A.Lucky?

题意:

给出一个六位数,如果它的前三位之和等于它的后三位之和,就输出 "YES",否则输出"NO"。

思路:

测试样例里面有的六位数不是真正的六位数,有的是‘0’开头的,所以选择用字符串来接收输入,用整型的话前面的0会自动去掉。后面字符串索引的时候就会越界。

代码:

点击查看代码
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner  scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		String[] str = new String[n];
		String[] isYes = new String[n];
		for(int i = 0 ;i < n;i++) {
			str[i] = scanner.next();
		}
		for(int i = 0;i < n;i++) {
			isYes[i] = check(str[i]);
		}
		for(int i = 0;i < n;i++) {
			System.out.println(isYes[i]);
		}
	}
	public static String check(String str) {
		int[] arr1 = new int[6];
		for(int i = 0;i < 6;i++) {
			arr1[i] = Integer.parseInt(str.charAt(i)+"");
		}
		if(arr1[0]+arr1[1]+arr1[2]==arr1[3]+arr1[4]+arr1[5]) {
			return "YES";
		}else {
			return "NO";
		}
	}
}

B.Equal Candies

题意:

有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();
			}
			int min = 10000000;
			int sum = 0;
			for(int i = 0;i < n;i++) {
				if(min>arr[i]) {
					min = arr[i];
				}
			}
			for(int i = 0;i < n;i++) {
				sum+=(arr[i]-min);
			}
			System.out.println(sum);
		}
	}
}

C.Most Similar Words

题意:

给出n个同样长度的英文字母,求每两串字母之间按字母表顺序变换的次数的最小值。比如两个单词 “best”和“cost”,第一个字母和第二个字母不一样,'b'变到'c'需要一次,'e'变到'o'需要10次,总共11次。如果有多个串,只需找到其中变换最少的一对,并输出次数就可以了。

思路:

声明一个字符类型的二维数组,再用字符串转化到二维数组里面,里面的每个元素对应一个字母。只要两个字符相减的绝对值就能得到两个字母的变换顺序,再用一个sum(每次比对前清0)记录下来,与最小值min对比一下,如果比min小就存到min里面去。

代码:

点击查看代码
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 m = scanner.nextInt();
			char[][] ch = new char[n][m];
			String[] str = new String[n];
			for(int i = 0;i < n;i++) {
				str[i] = scanner.next();
				ch[i] = str[i].toCharArray();
			}
			int min = 10000;
			int sum = 0;
			for(int i = 0;i < n;i++) {
				for(int j = i+1;j < n;j++) {
					sum = 0;
					for(int k = 0;k < m;k++) {
						sum += Math.abs(ch[j][k]-ch[i][k]);
					}
					if(sum<min) {
						min = sum;
					}
				}
			}
			System.out.println(min);
		}
	}
}

D. X-Sum

题意:

给一个n*m的方格,每个小格子里面都有一个数字,然后求出一个方格,它被两条斜线穿过,将这两条斜线上的方格的数加起来,求总和最大的那个。

比如这里的(3,3),1+4+3+4+4+4=20,是所有格子为中心的两条斜线和最大的。

思路:

依次遍历每个格子为中心的情况的和,把最大值存在max里面。求斜线上的和的值的话就依次向四个方向去加,在不越界的情况下每次 i++j++,i--j--,i++j--,i--j++,先检验一下,再加到sum里面去,出去后和max对比。

代码:

点击查看代码
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 m = scanner.nextInt();
			int[][] arr = new int[n][m];
			for(int i = 0;i < n;i++) {
				for(int j = 0;j < m;j++) {
					arr[i][j] = scanner.nextInt();
				}
			}
			int max = 0;
			int sum = 0;
			for(int i = 0;i < n;i++) {
				for(int j = 0;j < m;j++) {
					sum = check(arr,i,j);
					if(sum>max) {
						max = sum;
					}
				}
			}
			System.out.println(max);
		}
	}
        //求和
	public static int check(int[][] arr,int x,int y) {
		int sum = arr[x][y];
		int i = x;
		int j = y;
		while(i+1<arr.length&&j+1<arr[i].length) {
			i++;
			j++;
			sum+=arr[i][j];
		}
		i = x;
		j = y;
		while(i-1>=0&&j-1>=0) {
			i--;
			j--;
			sum+=arr[i][j];
		}
		i = x;
		j = y;
		while(i-1>=0&&j+1<arr[i].length) {
			i--;
			j++;
			sum+=arr[i][j];
		}
		i = x;
		j = y;
		while(i+1<arr.length&&j-1>=0) {
			i++;
			j--;
			sum+=arr[i][j];
		}
		return sum;	
	}
}

E.迷子のCDケース

交换唱片的题

题意:

输入N和M
后面M行,每行一个数字,表示高桥君今天想听的唱片,将目前正在放的碟子与其调换
输出最后还在盒子中的碟子的顺序,要换行

第零天默认顺序:
正在放零号
盒子中顺序为1,2,3,4...N-1,N

样例:
输入
5 6
2
3
5
0
1
3
输出
0
5
2
4
1

思路:

先声明一个下标和元素相同的数组。然后每输入一个数,就把放这个数的元素与0号元素交换值,这个数就到下标为0的元素。要用输入的数去比对元素值,而不是下标,然后开始时元素和下标相等时没有影响,后面交换了就不一样了,就会出错。

代码:

点击查看代码
import java.util.Scanner;
public class MainF {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int m = scanner.nextInt();
		int[] arr = new int[n+1];
		for(int i = 0;i <= n;i++) {
			arr[i] = i;
		}
		for(int i = 0;i < m;i++) {
			int s = scanner.nextInt();
			for(int j = 1;j <= n;j++) {
				if(s==arr[j]) {
					int temp = arr[j];
					arr[j] = arr[0];
					arr[0] = temp;
				}
			}
		}
		for(int i = 1;i <= n;i++) {
			System.out.println(arr[i]);
		}
	}
}

F.ゴールドラッシュ

求两个数组中对应元素最大的那个的和的问题。

题意:

stove君是一个矿工,他现在有7天挖矿时间

然后他有两个地方可以挖矿,沙漠的矿山和平原的矿山

第一行,输入7个数代表再第i天如果在沙漠的矿山拿到的工资

第二行,输入7个数代表再第i天如果在平原的矿山拿到的工资

每天只能选择一处工作,问stove最多可以赚多少钱?

例如:
输入
4 2 0 5 6 2 5
6 1 4 3 6 4 6
输出
33

思路:

在两个数组中将对应的数对比一下,将大的数加到sum里去。

代码:

点击查看代码
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[] arr = new int[7];
		int[] arr1 = new int[7];
		int[] arr2 = new int[7];
		for(int i = 0;i < 7;i++) {
			arr[i] = scanner.nextInt();
		}
		for(int i = 0;i < 7;i++) {
			arr1[i] = scanner.nextInt();
		}
		int sum = 0;
		for(int i = 0;i < 7;i++) {
			if(arr[i]>arr1[i]) {
				arr2[i] = arr[i];
			}else {
				arr2[i] = arr1[i];
			}
			sum += arr2[i];
		}
		System.out.println(sum);
	}
}

G.心配性な富豪、ファミリーレストランに行く。

求第二大的数的问题。

题意:

输入N,和N个数字,问第二大的数是多少

注意:输入 4

100 200 300 300

(200是认为第二大的)

2<=N<=100,N个数字的范围在1~1000

思路:

遍历数组,每次与Max对比,每次找到新的最大值,就将之前的最大值存到第二大的数里面去,注意后面已经找到了最大值,而倒数第二大的数却在后面,这样就要再按条件找一下。

代码:

点击查看代码
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];
		int max = 0;
		int next = 0;
		for(int i = 0;i < n;i++) {
			arr[i] = scanner.nextInt();
			if(arr[i]>max) {
				next = max;
				max = arr[i];
			}if(arr[i]>next&&arr[i]<max) {
				next = arr[i];
			}
		}
		System.out.println(next);
	}
}

H.双生独白

题意:

为了形式化地描述颜色,我们引入 RGB 颜色值,用三元组 (r,g,b)(r,g,b) 表示一种颜色,其中 r,g,b 分别为该颜色的 R 值、G 值、B 值,满足 0≤r,g,b≤255 且皆为十进制整数。

显然,这套颜色系统一共可以表示 256×256×256=16777216 种不同的颜色。对于颜色 (r,g,b)(r,g,b),定义其反色的 RGB 颜色值为 (255-r,255-g,255-b)。

然而人们发现,单纯地使用 RGB 颜色值很不方便,复制颜色时要复制三个值。

于是诞生了十六进制颜色码,即形如 #EBA932 长度为 77 的字符串。具体而言:

字符串的第一位是 #,为颜色码标识符。
字符串的第二、三位是十六进制数码,拼成的十六进制数等于十进制下所示颜色的 R 值。
字符串的第四、五位是十六进制数码,拼成的十六进制数等于十进制下所示颜色的 G 值。
字符串的第六、七位是十六进制数码,拼成的十六进制数等于十进制下所示颜色的 B 值。
十六进制数码从小到大包含 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,注意 A,B,C,D,E,F 均为大写。

现在你收到了一组十六进制颜色码,请你输出其反色的十六进制颜色码。

提示:颜色的 RGB 值与十六进制码之间可以相互转换(参考样例解释 #2)

输入格式
一行,输入长度为 7 的字符串,表示原色的十六进制颜色码。

输出格式
一行,输出长度为 7 的字符串,表示反色的十六进制颜色码。

例如:
输入:
#EBA932
输出:
#1456CD

思路:

使用字符串接收,注意要两个字母一起,才能转化成一个10进制的数,十六进制数FFH转换为十进制数是255,先计算十六进制数每位乘以权值,最后将所有结果相加得十进制结果。然后用255减了再转化回来。

点击查看代码
import java.util.Scanner;
public class Main {
	static char[] ch = new char[] {' ','A','B','C','D','E','F'};
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String str = scanner.next();
		int R = toInt(""+str.charAt(1)+str.charAt(2));
		int G = toInt(""+str.charAt(3)+str.charAt(4));
		int B = toInt(""+str.charAt(5)+str.charAt(6));
		
		R = 255 - R;
		G = 255 - G;
		B = 255 - B;
		String str1 = "#";
		str1 = str1 + toStr(R) + toStr(G) + toStr(B);
		System.out.println(str1);
		
		
	}
	public static int toInt(String str) {
		int num = 0;
		int a = 0;
		int b = 0;
		if(str.charAt(0)>=48&&str.charAt(0)<=57) {
			a = Integer.parseInt(str.charAt(0)+"");			
		}else {
			for(int i = 1;i <= 6;i++) {
				if(str.charAt(0)==ch[i]) {
					a = i+9; 
				}
			}
		}
		if(str.charAt(1)>=48&&str.charAt(1)<=57) {
			b = Integer.parseInt(str.charAt(1)+"");
		}else {
			for(int i = 1;i <= 6;i++) {
				if(str.charAt(1)==ch[i]) {
					b = i+9; 
				}
			}
		}
		num = a*16 + b;
		return num;
	}
	
	public static String toStr(int n ) {
		int ch1,ch2;
		ch1 = n / 16;
		ch2 = n % 16;
		String str1 = "";
		String str2 = "";
		if(ch1>=10) {
			str1 = ""+ch[ch1-9];
		}else {
			str1 = ch1+"";
		}
		if(ch2>=10) {
			str2 = ""+ch[ch2-9];
		}else {
			str2 = ch2+"";
		}
		String str3 = str1+str2;
		return str3;
	}
}

####代码:

标签:arr,scanner,int,SMU,冬训,第三周,++,sum,Scanner
From: https://www.cnblogs.com/Tcoo/p/17056618.html

相关文章

  • 第三周
    一、C程序编译过程C语言程序的编译主要经过四个过程:#分步骤编译运行$gcc-Ehello.c-ohello.i#对hello.c文件进行预处理,生成hello.i文件$gcc-Shello.i-o......
  • SMU冬训营第二周蓝桥杯模拟赛
    A.解码题目:小明有一串很长的英文字母,可能包含大写和小写。在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母+......
  • SMU Winter 2023 Round #3 (Div.2)
    B.三元组题目:给定一个长度为n的数列a,对于一个有序整数三元组(i,j,k),若其满足1≤i≤j≤k≤n并且ai+aj=ak,则我们称这个三元组是「传智的」。现在请你计算,有......
  • SMU Winter 2023 Round #4
    A.Chuanpai题目:Chuanpai(川牌)isakindoftraditionalplayingcardsinSichuan.Eachcardismarkedwithtwointegersxandywhere1≤x≤y≤6.Somesa......
  • 《冬训周报二》
    埃氏筛选法概念埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的......
  • SMU Winter 2023 Round #2 (Div.2)(英文)
    A.MediumNumber题目:Giventhreedistinctintegersa,b,andc,findthemediumnumberbetweenallofthem.Themediumnumberisthenumberthatisneitherthe......
  • SMU Winter 2023 Round #1 (Div.2)
    A.不可以,总司令题目:扶苏当上了星战地球舰队的参谋长,但是她不太聪明。人工智能计算出,如果扶苏在一直回答“NO”的话,她在战役中判断完全正确的概率为x%;如果她一直在回答......
  • SMU 冬令营第一周蓝桥杯模拟赛
    A.带分数题目:100可以表示为带分数的形式:100=3+69258/714。还可以表示为:100=82+3546/197。注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。类似这......
  • 1.4 SMU Winter 2023 Round #1 (Div.2)
    [语言月赛202212]不可以,总司令思路:比较大小 if(x>y)cout<<"NO";elseif(x<y)cout<<"YES";elsecout<<"equalprobability"; [语言月赛202212]计算......
  • 1.6 SMU Winter 2023 Round #2 (Div.2)
    SMUWinter2023Round#2(Div.2)1760A-MediumNumber思路:排列后,输出第二大的数intmain(){intt,a[5];cin>>t;while(t--){for(inti=0;i......