2019年第十届蓝桥杯[Java]

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();
	}
}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值