蓝桥杯 表格计算
某次无聊中, atm 发现了一个很老的程序。这个程序的功能类似于 Excel ,它对一个表格进行操作。
不妨设表格有 n 行,每行有 m 个格子。
每个格子的内容可以是一个正整数,也可以是一个公式。
公式包括三种:
1. SUM(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的和。
2. AVG(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的平均数。
3. STD(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的标准差。
标准差即为方差的平方根。
方差就是:每个数据与平均值的差的平方的平均值,用来衡量单个数据离开平均数的程度。
公式都不会出现嵌套。
如果这个格子内是一个数,则这个格子的值等于这个数,否则这个格子的值等于格子公式求值结果。
输入这个表格后,程序会输出每个格子的值。atm 觉得这个程序很好玩,他也想实现一下这个程序。
「输入格式」
第一行两个数 n, m 。
接下来 n 行输入一个表格。每行 m 个由空格隔开的字符串,分别表示对应格子的内容。
输入保证不会出现循环依赖的情况,即不会出现两个格子 a 和 b 使得 a 的值依赖 b 的值且 b 的值依赖 a 的值。
「输出格式」
输出一个表格,共 n 行,每行 m 个保留两位小数的实数。
数据保证不会有格子的值超过 1e6 。
「样例输入」
3 2
1 SUM(2,1:3,1)
2 AVG(1,1:1,2)
SUM(1,1:2,1) STD(1,1:2,2)
「样例输出」
1.00 5.00
2.00 3.00
3.00 1.48
「数据范围」
对于 30% 的数据,满足: n, m <= 5
对于 100% 的数据,满足: n, m <= 50
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
题解:这就是一个Java的模拟题 要注意细节。
学到的知识点:
Java中输出double类型保留几位小数的最简便格式为:System.out.printf("%.2f ",val);
string类型的方法中,charAt(index) 传入的是一个下标,意思是将该字符串的index位置变成字符取出。indexOf方法传入一个字符串,找出该字符串中传入字符串的位置。
1 import java.util.Scanner; 2
3 public class Main { 4 static int n,m; 5 static int [] sub(String s) { 6 int [] c = new int [6]; 7 for(int i=0;i<c.length;i++) 8 c[i] = 0; 9 c[1] = s.charAt(4)-'0'; 10 c[2] = s.charAt(6)-'0'; 11 c[3] = s.charAt(8)-'0'; 12 c[4] = s.charAt(10)-'0'; 13 return c; 14 } 15 static double cal(String string) { 16 int c[] = sub(string); 17 if(string.substring(0, 3).equals("SUM")) { 18 return sum(c); 19 } 20 else if(string.substring(0, 3).equals("STD")) { 21 return std(c); 22 } 23 else
24 return avg(c); 25 } 26 static double sum(int a[]) { 27 double ans = 0; 28
29 for(int i=a[1];i<=a[3];i++) { 30 for(int j=a[2];j<=a[4];j++) { 31 if(s[i][j].charAt(0)<'0'||s[i][j].charAt(0)>'9') 32 ans+=cal(s[i][j]); 33 else
34 ans+=Double.parseDouble(s[i][j]); 35 } 36 } 37 return ans; 38 } 39 static double avg(int a[]) { 40 double ans = sum(a); 41 double cnt = (a[3]-a[1]+1)*(a[4]-a[2]+1); 42 return ans/cnt; 43 } 44 static double std(int a[]) { 45 double ans = 0; 46 double ave = avg(a); 47 double cnt = (a[3]-a[1]+1)*(a[4]-a[2]+1); 48 for(int i=a[1];i<=a[3];i++) { 49 for(int j=a[2];j<=a[4];j++) { 50 if(s[i][j].charAt(0)<'0'||s[i][j].charAt(0)>'9') 51 ans+=(cal(s[i][j])-ave)*(cal(s[i][j])-ave); 52 else
53 ans+=(Double.parseDouble(s[i][j])-ave)*(Double.parseDouble(s[i][j])-ave); 54
55 } 56 } 57 return Math.sqrt(ans/cnt); 58 } 59 static String [][] s = new String [55][55]; 60 static double [][] val = new double [55][55]; 61 public static void main(String[] args) { 62 Scanner cin = new Scanner(System.in); 63 n = cin.nextInt(); 64 m = cin.nextInt(); 65 for(int i=1;i<=n;i++) { 66 for(int j=1;j<=m;j++) { 67 String tmp = cin.next(); 68 s[i][j] = tmp; 69 } 70 } 71 for(int i=1;i<=n;i++) { 72 for(int j=1;j<=m;j++) { 73 if(s[i][j].charAt(0)<'0'||s[i][j].charAt(0)>'9') { 74 val[i][j] = cal(s[i][j]); 75 } 76 else { 77 val[i][j] = Double.parseDouble(s[i][j]); 78 } 79 } 80 } 81 for(int i=1;i<=n;i++) { 82 for(int j=1;j<m;j++) { 83 System.out.printf("%.2f ",val[i][j]); 84 } 85 System.out.printf("%.2f\n", val[i][m]); 86 } 87 } 88 }