2019年第十届蓝桥杯[Java]
特别数的和
【题目描述】
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?
【输入】
输入一行包含两个整数 n。
【输出】
输出一行,包含一个整数,表示满足条件的数的和
【样例输入】
40
【样例输出】
574
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = 0;
for(int i = 1; i <= n; i++) {
String str = Integer.toString(i);
// if(str.indexOf('2') != -1 || str.indexOf('0') != -1 || str.indexOf('1') != -1 || str.indexOf('9') != -1) {
if(str.contains("2") || str.contains("0") || str.contains("1") || str.contains("9")) {
sum += i;
}
}
System.out.println(sum);
sc.close();
}
}
等差数列
【题目描述】
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有 几项?
【输入】
输入的第一行包含一个整数 N。 第二行包含N个整数A1,A2,···,AN。(注意A1 ∼AN并不一定是按等差数列中的顺序给出)
【输出】
输出一个整数表示答案
【样例输入】
5
2 6 4 10 20
【样例输出】
10
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] x = new int[N];
for (int i = 0; i < N; i++) {
x[i] = sc.nextInt();
}
Arrays.sort(x);
int d = Integer.MAX_VALUE;
for (int i = 0; i < x.length - 1; i++) {
if (d > x[i + 1] - x[i]) {
d = x[i + 1] - x[i];
}
}
if (d == 0) {
System.out.println(N);
} else {
System.out.println((x[x.length - 1] - x[0]) / d + 1);
}
sc.close();
}
}
后缀表达式
【题目描述】
给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1, A2, · · · , AN+M+1,小 明想知道在所有由这 N 个加号、M 个减号以及 N + M + 1 个整数凑出的合法的 后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。
【输入】
第一行包含两个整数 N 和 M。
第二行包含 N + M + 1 个整数 A1, A2, · · · , AN+M+1。
【输出】
输出一个数,表示答案
【样例输入】
1 1
1 2 3
【样例输出】
4
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int add = sc.nextInt();
int reduce = sc.nextInt();
int t = add + reduce + 1;
int[] number = new int[t];
for (int i = 0; i < t; i++) {
number[i] = sc.nextInt();
}
long sum = 0;
if (reduce == 0 && add == 0) {
sum += number[0];
}
if (reduce == 0 && add != 0) {
for (int i = 0; i < t; i++) {
sum += number[i];
}
}
if (add == 0 && reduce != 0) {
Arrays.sort(number);
if (number[0] < 0) {
for (int i = 0; i <= reduce; i++) {
if (number[i] > 0) {
sum += number[i];
} else {
sum -= number[i];
}
}
} else {
for (int i = 1; i <= reduce; i++) {
sum += number[i];
}
sum -= number[0];
}
}
if (add != 0 && reduce != 0) {
int reduceNum = 0;
for (int i = 0; i < t; i++) {
if (number[i] < 0) {
reduceNum++;
}
}
if (reduce >= reduceNum) {
if (reduceNum != 0) {
Arrays.sort(number);
for (int i = 0; i < reduceNum; i++) {
number[i] = -number[i];
}
// Arrays.sort(number);
for (int i = t - 1; i >= 0; i--) {
sum += number[i];
}
}else {
Arrays.sort(number);
for (int i = t - 1; i > 0; i--) {
sum += number[i];
}
sum -= number[0];
}
} else {
Arrays.sort(number);
sum += number[t - 1];
for (int i = 0; i < t - 1; i++) {
if (number[i] > 0) {
sum += number[i];
} else {
sum -= number[i];
}
}
}
}
System.out.println(sum);
sc.close();
}
}
旋转
【题目描述】
图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。
我们用一个 n × m 的二维数组来表示一个图片,例如下面给出一个 3 × 4 的图片例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转 90 度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片
【输入】
输入的第一行包含两个整数 n 和 m,分别表示行数和列数。
接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像
素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。
【输出】
输出 m 行 n 列,表示旋转后的图片。
【样例输入】
3 4
1 3 5 7
9 8 7 6
3 5 9 7
【样例输出】
3 9 1
5 8 3
9 7 5
7 6 7
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] x = new int[m][n];
for (int j = n - 1; j >= 0; j--) {
for(int i = 0; i < m; i++) {
x[i][j] = sc.nextInt();
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
System.out.print(x[i][j] + " ");
}
System.out.println();
}
sc.close();
}
}
Fibonacci 数列与黄金分割
【题目描述】
Fibonacci 数列是非常著名的数列:
F[1] = 1,
F[2] = 1,
对于 i > 3,F[i] = F[i − 1] + F[i − 2]
Fibonacci 数列有一个特殊的性质,前一项与后一项的比值,F[i]/F[i + 1], 会趋近于黄金分割。
为了验证这一性质,给定正整数 N,请你计算 F[N]/F[N + 1],并保留 8 位 小数。
【输入】
一个正整数 N。(1 ≤ N ≤ 2000000000)
【输出】
F[N]/F[N + 1]。答案保留 8 位小数。
【样例输入】
2
【样例输出】
0.50000000
代码
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
if(n == 1) {
System.out.println("1.00000000");
}
else if (n > 50) {
System.out.println("0.61803399");
} else {
BigDecimal[] f = new BigDecimal[(int)n + 2];
f[1] = BigDecimal.ONE;
f[2] = BigDecimal.ONE;
for (int i = 3; i <= n + 1; i++) {
f[i] = f[i - 1].add(f[i - 2]);
}
System.out.println(f[(int)n].divide(f[(int)n + 1], 8, BigDecimal.ROUND_HALF_UP));
}
sc.close();
}
}