表格计算

某次无聊中, 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,否则按无效代码处理。

import java.util.ArrayList;
import java.util.Scanner; public class Main {
public static int n, m;
public static double[][] value; public double getSum(int x1, int y1, int x2, int y2) {
double sum = 0;
for(int i = x1;i <= x2;i++)
for(int j = y1;j <= y2;j++)
sum = sum + value[i][j];
return sum;
} public double getAvg(int x1, int y1, int x2, int y2) {
int count = Math.abs((x2 - x1 + 1) * (y2 - y1 + 1));
double avg = getSum(x1, y1, x2, y2) / count;
return avg;
} public double getStd(int x1, int y1, int x2, int y2) {
int count = Math.abs((x2 - x1 + 1) * (y2 - y1 + 1));
double avg = getAvg(x1, y1, x2, y2);
double result = 0;
for(int i = x1;i <= x2;i++)
for(int j = y1;j <= y2;j++)
result = result + (value[i][j]-avg) * (value[i][j]-avg);
result = Math.sqrt(result / count);
return result;
} public boolean check(int x1, int y1, int x2, int y2) {
boolean judge = true;
for(int i = x1;i <= x2;i++) {
if(!judge)
break;
for(int j = y2;j <= y2;j++) {
if(value[i][j] == -1) {
judge = false;
break;
}
}
}
return judge;
} public String[] getOperaAndNum(String arrayA) {
int p = arrayA.indexOf("(");
int q = arrayA.indexOf(")");
String opera = arrayA.substring(0, p);
arrayA = arrayA.replace(':', ',');
String[] num = arrayA.substring(p+1, q).split(",");
String[] result = new String[5];
result[0] = opera;
for(int i = 0;i < 4;i++)
result[i + 1] = num[i];
return result;
} public void getResult(String[] A) {
value = new double[n][m];
ArrayList<String> list = new ArrayList<String>();
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
value[i][j] = -1;
for(int i = 0;i < A.length;i++) {
String[] arrayA = A[i].split(" ");
for(int j = 0;j < arrayA.length;j++) {
if(arrayA[j].charAt(0) >= '0' && arrayA[j].charAt(0) <= '9') {
value[i][j] = Double.valueOf(arrayA[j]);
} else {
String[] r = getOperaAndNum(arrayA[j]);
String opera = r[0];
int x1 = Integer.valueOf(r[1]) - 1;
int y1 = Integer.valueOf(r[2]) - 1;
int x2 = Integer.valueOf(r[3]) - 1;
int y2 = Integer.valueOf(r[4]) - 1;
if(check(x1, y1, x2, y2) == false) {
list.add(""+i+" "+j+" "+arrayA[j]);
continue;
}
if(opera.equals("SUM"))
value[i][j] = getSum(x1, y1, x2, y2);
else if(opera.equals("AVG"))
value[i][j] = getAvg(x1, y1, x2, y2);
else if(opera.equals("STD"))
value[i][j] = getStd(x1, y1, x2, y2);
}
}
} while(!list.isEmpty()) {
for(int i = list.size() - 1;i >= 0;i--) {
String[] temp = list.get(i).split(" ");
int a = Integer.valueOf(temp[0]);
int b = Integer.valueOf(temp[1]);
String[] r = getOperaAndNum(temp[2]);
String opera = r[0];
int x1 = Integer.valueOf(r[1]) - 1;
int y1 = Integer.valueOf(r[2]) - 1;
int x2 = Integer.valueOf(r[3]) - 1;
int y2 = Integer.valueOf(r[4]) - 1;
if(check(x1, y1, x2, y2) == false)
continue;
if(opera.equals("SUM"))
value[a][b] = getSum(x1, y1, x2, y2);
else if(opera.equals("AVG"))
value[a][b] = getAvg(x1, y1, x2, y2);
else if(opera.equals("STD"))
value[a][b] = getStd(x1, y1, x2, y2);
list.remove(i);
}
}
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
System.out.printf("%.2f", value[i][j]);
if(j != m - 1)
System.out.print(" ");
}
System.out.println();
}
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
in.nextLine();
String[] A = new String[n];
for(int i = 0;i < n;i++)
A[i] = in.nextLine();
test.getResult(A);
}
}

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. 《 .NET并发编程实战》一书中的节流为什么不翻译成限流

    有读者问,为什么< .NET并发编程实战>一书中的节流为什么不翻译成限流? 这个问题问得十分好!毕竟“限流”这个词名气很大,耳熟能详,知名度比“节流”大多了. 首先,节流的原词Thrott ...

  2. Spring Cache的基本使用与分析

    概述 使用 Spring Cache 可以极大的简化我们对数据的缓存,并且它封装了多种缓存,本文基于 redis 来说明. 基本使用 1.所需依赖 <dependency> <gro ...

  3. fragment hide/show 生命周期

    Fragment的使用越来越普遍了,掌握它的生命周期以及注意事项时非常有必要的,首先 All subclasses of Fragment must include a public empty co ...

  4. JSP+Servlet+JDBC+mysql实现的个人日记本系统

    项目简介 项目来源于:https://gitee.com/wishwzp/Diary 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的个人日记本系统.涉及技术少 ...

  5. 《学习笔记》Layui-WPF窗体美化

    一睹为快: 1.创建自定义控件,并取名为LayuiWPFStyle 2.在当前目录中创建Fonts和WindowStyle文件加用来存放字体文件和自定义窗体,字体用fontawesome字体当然你们可 ...

  6. Codeforces1176B(B题)Merge it!

    B. Merge it! You are given an array aanna1,a2,…,ana1,a2,…,an In one operation you can choose two ele ...

  7. mybatis 分页失败 始终pageSize = 2147483647

    是在使用分页查询时 this.jobReadMapper.beginPager(pageParam);XXXXXXXXXXXXXXXXXXXXXXXXthis.xxxReadMapper.queryB ...

  8. ShoneSharp语言(S#)的设计和使用介绍系列(7)— 布尔Bool及对象Object

    ShoneSharp语言(S#)的设计和使用介绍 系列(7)— 布尔Bool及对象Object 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ ...

  9. Java——关键字和保留字

    Java关键字50个 abstract assert boolean break byte case catch char class const continue default do double ...

  10. MarkDown语法使用(效果版本)

    function syntaxHighlighting() { var n = 33; var s = "hello, こんにちは"; console.log(s); } plai ...