表格计算

某次无聊中, 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及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

  1. import java.util.ArrayList;
  2. import java.util.Scanner;
  3. public class Main {
  4. public static int n, m;
  5. public static double[][] value;
  6. public double getSum(int x1, int y1, int x2, int y2) {
  7. double sum = 0;
  8. for(int i = x1;i <= x2;i++)
  9. for(int j = y1;j <= y2;j++)
  10. sum = sum + value[i][j];
  11. return sum;
  12. }
  13. public double getAvg(int x1, int y1, int x2, int y2) {
  14. int count = Math.abs((x2 - x1 + 1) * (y2 - y1 + 1));
  15. double avg = getSum(x1, y1, x2, y2) / count;
  16. return avg;
  17. }
  18. public double getStd(int x1, int y1, int x2, int y2) {
  19. int count = Math.abs((x2 - x1 + 1) * (y2 - y1 + 1));
  20. double avg = getAvg(x1, y1, x2, y2);
  21. double result = 0;
  22. for(int i = x1;i <= x2;i++)
  23. for(int j = y1;j <= y2;j++)
  24. result = result + (value[i][j]-avg) * (value[i][j]-avg);
  25. result = Math.sqrt(result / count);
  26. return result;
  27. }
  28. public boolean check(int x1, int y1, int x2, int y2) {
  29. boolean judge = true;
  30. for(int i = x1;i <= x2;i++) {
  31. if(!judge)
  32. break;
  33. for(int j = y2;j <= y2;j++) {
  34. if(value[i][j] == -1) {
  35. judge = false;
  36. break;
  37. }
  38. }
  39. }
  40. return judge;
  41. }
  42. public String[] getOperaAndNum(String arrayA) {
  43. int p = arrayA.indexOf("(");
  44. int q = arrayA.indexOf(")");
  45. String opera = arrayA.substring(0, p);
  46. arrayA = arrayA.replace(':', ',');
  47. String[] num = arrayA.substring(p+1, q).split(",");
  48. String[] result = new String[5];
  49. result[0] = opera;
  50. for(int i = 0;i < 4;i++)
  51. result[i + 1] = num[i];
  52. return result;
  53. }
  54. public void getResult(String[] A) {
  55. value = new double[n][m];
  56. ArrayList<String> list = new ArrayList<String>();
  57. for(int i = 0;i < n;i++)
  58. for(int j = 0;j < m;j++)
  59. value[i][j] = -1;
  60. for(int i = 0;i < A.length;i++) {
  61. String[] arrayA = A[i].split(" ");
  62. for(int j = 0;j < arrayA.length;j++) {
  63. if(arrayA[j].charAt(0) >= '0' && arrayA[j].charAt(0) <= '9') {
  64. value[i][j] = Double.valueOf(arrayA[j]);
  65. } else {
  66. String[] r = getOperaAndNum(arrayA[j]);
  67. String opera = r[0];
  68. int x1 = Integer.valueOf(r[1]) - 1;
  69. int y1 = Integer.valueOf(r[2]) - 1;
  70. int x2 = Integer.valueOf(r[3]) - 1;
  71. int y2 = Integer.valueOf(r[4]) - 1;
  72. if(check(x1, y1, x2, y2) == false) {
  73. list.add(""+i+" "+j+" "+arrayA[j]);
  74. continue;
  75. }
  76. if(opera.equals("SUM"))
  77. value[i][j] = getSum(x1, y1, x2, y2);
  78. else if(opera.equals("AVG"))
  79. value[i][j] = getAvg(x1, y1, x2, y2);
  80. else if(opera.equals("STD"))
  81. value[i][j] = getStd(x1, y1, x2, y2);
  82. }
  83. }
  84. }
  85. while(!list.isEmpty()) {
  86. for(int i = list.size() - 1;i >= 0;i--) {
  87. String[] temp = list.get(i).split(" ");
  88. int a = Integer.valueOf(temp[0]);
  89. int b = Integer.valueOf(temp[1]);
  90. String[] r = getOperaAndNum(temp[2]);
  91. String opera = r[0];
  92. int x1 = Integer.valueOf(r[1]) - 1;
  93. int y1 = Integer.valueOf(r[2]) - 1;
  94. int x2 = Integer.valueOf(r[3]) - 1;
  95. int y2 = Integer.valueOf(r[4]) - 1;
  96. if(check(x1, y1, x2, y2) == false)
  97. continue;
  98. if(opera.equals("SUM"))
  99. value[a][b] = getSum(x1, y1, x2, y2);
  100. else if(opera.equals("AVG"))
  101. value[a][b] = getAvg(x1, y1, x2, y2);
  102. else if(opera.equals("STD"))
  103. value[a][b] = getStd(x1, y1, x2, y2);
  104. list.remove(i);
  105. }
  106. }
  107. for(int i = 0;i < n;i++) {
  108. for(int j = 0;j < m;j++) {
  109. System.out.printf("%.2f", value[i][j]);
  110. if(j != m - 1)
  111. System.out.print(" ");
  112. }
  113. System.out.println();
  114. }
  115. }
  116. public static void main(String[] args) {
  117. Main test = new Main();
  118. Scanner in = new Scanner(System.in);
  119. n = in.nextInt();
  120. m = in.nextInt();
  121. in.nextLine();
  122. String[] A = new String[n];
  123. for(int i = 0;i < n;i++)
  124. A[i] = in.nextLine();
  125. test.getResult(A);
  126. }
  127. }

java实现第六届蓝桥杯表格计算的更多相关文章

  1. java实现第六届蓝桥杯垒骰子

    垒骰子 题目描述 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...

  2. java实现第六届蓝桥杯居民集会

    居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di. 每年,蓝桥村都要举行一次集会.今年,由于村里的人口太多 ...

  3. java实现第六届蓝桥杯切开字符串

    切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两段都必 ...

  4. java实现第六届蓝桥杯四阶幻方

    四阶幻方 把1~16的数字填入4x4的方格中,使得行.列以 及两个对角线的和都相等,满足这样的特征时称 为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1 ,请计算一共有多少种方案. 比如: ...

  5. java实现第六届蓝桥杯穿越雷区

    穿越雷区 题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能 ...

  6. java实现第六届蓝桥杯密文搜索

    密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  7. java实现第六届蓝桥杯奇怪的数列

    奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 - YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行& ...

  8. java实现第六届蓝桥杯奇妙的数字

    奇妙的数字 奇妙的数字 小明发现了一个奇妙的数字.它的平方和立方正好把0~9的10个数字每个用且只用了一次. 你能猜出这个数字是多少吗? 请填写该数字,不要填写任何多余的内容. 结果:69 impor ...

  9. java实现第六届蓝桥杯循环节长度

    循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位. 下面的方法,可以 ...

随机推荐

  1. 关于SpringBoot的外部化配置使用记录

    关于SpringBoot的外部化配置使用记录 声明: 若有任何纰漏.错误请不吝指出! 记录下使用SpringBoot配置时遇到的一些麻烦,虽然这种麻烦是因为知识匮乏导致的. 记录下避免一段时间后自己又 ...

  2. Date工具遇到的一个坑

    private Date contractBeginDate(){ Calendar calendar = Calendar.getInstance(); calendar.setTime(new D ...

  3. 对background: url("~assets/img/common/collect.svg") 0 0/14px 14px 的理解

    需求:给收藏数字前面通过::before伪元素添加图标 相关代码: .goods-info .collect { position: relative; } .goods-info .collect: ...

  4. 关于mysql的metadata lock

    昨天晚上上线,却发现一个ddl语句长时间没有生效 查processlist, 发现包括ddl语句在内的众多查询提示 “Waiting for table metadata lock” 唯一没有该提示的 ...

  5. 存储系列之 硬盘接口与SCSI总线协议

    本文主要介绍硬盘的接口.总线和协议,SSD与SATA硬盘一般是兼容的,NVmeSSD除外. 一.磁盘控制器 上一章介绍了存储系统的主要介质硬盘,而硬盘的读写通过磁头臂,磁头臂是由磁盘驱动器来控制的.磁 ...

  6. BZOJ1066 网络流

    拆点,将一个柱子拆成入点和出点,入点出点之间的容量就是柱子的容量    1066: [SCOI2007]蜥蜴 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多 ...

  7. mysql中 Rank、DENSE_RANK()的区别

    相同点:RANK()和DENSE_RANK()的是排名函数 不同点:RANK()是跳跃排序,即如果有两条记录重复,接下来是第三级别 如:1 2 2 4,会跳过3 DENSE_RANK()是连续排序,即 ...

  8. 实验五:shell脚本编程

    项目 内容 这个作业属于哪个课程 班级课程的主页链接 这个作业的要求在哪里 作业要求链接地址 学号-姓名 17043133-木腾飞 作业学习目标 1.了解shell 脚本的概念及应用2.掌握shell ...

  9. 对 eval 命令的理解

    eval 格式:eval [argument...] 可以二次迭代参数中的引用变量,然后将参数作为命令,在shell中执行 如果是多个参数,那么变量替换之后必须符合某个命令的格式,否则eval会报错& ...

  10. 2020 网鼎杯wp

    2020 网鼎杯WP 又是划水的一天,就只做出来4题,欸,还是太菜,这里就记录一下做出的几题的解题记录 AreUSerialz 知识点:反序列化 打开链接直接给出源码 <?php include ...