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
解答:
待补充