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;
}
}