【题目】Problem A.求导数 - Problem B.LIST - Problem C.图像压缩存储 - Problem D.解析表达式

Problem A.求导数

描述:求函数f(x) = ax3 + bx2 + c*x + d在x = x0
x0​处的一阶导数。

输入:a b c d x0x0​。

输出:f’(x0x0​)。

样例输入:1 1 1 1 1

样例输出:6

解答:

import java.util.Scanner;
/*
Problem A.求导数
描述:求函数f(x) = ax3 + bx2 + c*x + d在x = x0
x0​处的一阶导数。
输入:a b c d x0x0​。
输出:f’(x0x0​)。
样例输入:1 1 1 1 1
样例输出:6
 */
public class Test{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			int a = scanner.nextInt(), b = scanner.nextInt(), c = scanner.nextInt(), x0 = scanner.nextInt();
			int diravtives = 3*a*x0*x0 + 2*b*x0 + c;
			System.out.println(diravtives);
		}
	}
}

Problem B.LIST

描述:在该LIST上实现3种操作
1、append x在该LIST末尾添加x,x是32位整数
2、pop删除该LIST末尾的数
3、find i寻找第i个数,若i为负数表示寻找倒数第i个数,例如i = -1表示寻找倒数第一个

输入:第一行输入一个m,表示有m条操作,接下来每行输入一条操作

输出:输出find i找到的数

输入范例

2
5
append 1
append 2
find 1
find -1
pop
6
append 1
append 2
append 3
append 4
find -2
find 2

输出范例

1
2
3
2

解答:

import java.util.Scanner;
import java.util.Stack;
/*
Problem B.LIST
描述:在该LIST上实现3种操作
1、append x在该LIST末尾添加x,x是32位整数
2、pop删除该LIST末尾的数
3、find i寻找第i个数,若i为负数表示寻找倒数第i个数,例如i = -1表示寻找倒数第一个
输入:第一行输入一个m,表示有m条操作,接下来每行输入一条操作
输出:输出find i找到的数
输入范例
2
5
append 1
append 2
find 1
find -1
pop
6
append 1
append 2
append 3
append 4
find -2
find 2
输出范例
1
2
3
2
 */
public class Test{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			int n = scanner.nextInt();
			for(int i = 0; i < n; i++) {
				Stack<Integer> list = new Stack<Integer>();
				int num = scanner.nextInt();
				for(int j = 0; j < num; j++) {
					String str = scanner.next();
					if(str.equals("append")) list.push(scanner.nextInt());
					else if(str.equals("pop"))	list.pop();
					else if(str.equals("find")) {
						int x = scanner.nextInt();
						if(x < 0) x += list.size();
						else x -= 1;
						System.out.println(list.get(x));
					}
				}
			}
		}
	}
}

Problem C.图像压缩存储

描述:以二维数组表示图像,其值只有0、1两种,寻找两幅图像中最大的相同部分
输入:第一行输入一个n,接下来的2n行输入两个n * n数组,寻找一个最大的m * m子区域,使得两个数组在该子区域完全相同

输出:输出上述m

样例输入
4
1 1 1 1
1 1 1 0
1 1 1 0
1 1 1 1

0 1 1 1
0 1 1 1
0 1 1 1
0 1 1 0
样例输出
2

解答:

import java.util.Scanner;
/*
Problem C.图像压缩存储

描述:以二维数组表示图像,其值只有0、1两种,寻找两幅图像中最大的相同部分
输入:第一行输入一个n,接下来的2n行输入两个n * n数组,寻找一个最大的m * m子区域,使得两个数组在该子区域完全相同
输出:输出上述m
样例输入:
4
1 1 1 1
1 1 1 0
1 1 1 0
1 1 1 1

0 1 1 1
0 1 1 1
0 1 1 1
0 1 1 0
样例输出:
2

解释:上述两个4阶数组中的一个2阶子区域(第1、2行,第2、3列完全相同)
异或取非后判断最大子矩形
以矩阵中每一个点作为正方形右下角点来处理
当该点为1时,以该点为右下角点的最大边长最多比以它的左方、上方和左上方为右下角的正方形边长多1
即如果该点左上的三个点有值为0的点,当前点所在的全为1的正方形最大边长只能为1
所以这时只能取另外三个正方形中最小的正方形边长+1。用d[i][j]表示以i,j坐标为右下角的正方形最大边。
则有状态转移方程:dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1

 */
public class Test{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			int n = scanner.nextInt();
			int count = 0;
			int[][] nums1 = new int[n][n];
			int[][] nums2 = new int[n][n];
			int[][] dp = new int[n][n];
			for(int i = 0; i < n; i++)
				for(int j = 0; j < n; j++)
					nums1[i][j] = scanner.nextInt();
			for(int i = 0; i < n; i++)
				for(int j = 0; j < n; j++) {
					nums2[i][j] = scanner.nextInt();
					dp[i][j] = ~(nums1[i][j] ^ nums2[i][j]) + 2;
				}
			for(int i = 1; i < n; i++) 
				for(int j = 1; j < n; j++) {
					if(dp[i][j] == 1) dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i][j-1], dp[i-1][j])) + 1;
					count = Math.max(count, dp[i][j]);
				}
			System.out.println(count);
		}
	}
}

Problem D.解析表达式

描述:输入一个字符串形式的表达式,该表达式中包括整数,四则运算符(+、-、*、/),括号,三角函数(sin(x)、cos(x)、tan(x)),底数函数(lg(x)、ln(x)),计算该表达式的值

输入:输入一个字符串形式的表达式,保证中间及最终结果不超出double的范围
输出:表达式的值,保留6位小数

样例输入
3
3+5
((2-1)*5-1)*6
1+cos(0)
sin(sin(1-1))

样例输出
3.000000
8.000000
24.000000
2.000000
0.000000

解答:
待补充

发布了233 篇原创文章 · 获赞 254 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_44485744/article/details/105037289
今日推荐