表格计算

某次无聊中, 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. 《机器学习_01_线性模型_线性回归_正则化(Lasso,Ridge,ElasticNet)》

    一.过拟合 建模的目的是让模型学习到数据的一般性规律,但有时候可能会学过头,学到一些噪声数据的特性,虽然模型可以在训练集上取得好的表现,但在测试集上结果往往会变差,这时称模型陷入了过拟合,接下来造一些 ...

  2. R的安装以及包安装

        今天看论文,需要用到R语言的库,于是又折腾了半天..     其实并没有什么太大的问题,只是在第三方包的下载方面还有python中使用R方面遇到了问题: 第三方包的导入      其实在网上有 ...

  3. mysql5.6 thread pool

    从percona 的压测来看,确实很牛笔啊.提升很大. http://www.mysqlperformanceblog.com/2014/01/29/percona-server-thread-poo ...

  4. linux常用命令---中英文设置

    中英文设置 LANG变量 echo $LANG---------查看当前编码 locale -----------------设置之后可查看详细信息 中文设置 # vim /etc/profile.d ...

  5. 点双连通分量F. Simple Cycles Edges

    F. Simple Cycles Edges time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  6. LightOJ1282

    题目大意: 给出 n 和 k,请你求出 n^k 次方的前三位和后三位. 解题思路: 后三位用快速幂,不加赘述. 求前三位的方法: AC代码: #include <iostream> #in ...

  7. 《机器学习_09_01_决策树_ID3与C4.5》

    简介 先看一个例子,某银行是否给用户放贷的判断规则集如下: if 年龄==青年: if 有工作==是: if 信贷情况==非常好: 放 else: 不放 else: if 有自己的房子==是: if ...

  8. NO.6 ADS1115与MSP432进行I2C通信_运行实例

    B站第一次传视频,手机拍摄大家见谅!

  9. js中 addEventListener 和removeEventListener

    js中添加事件监听本来是非常常见的事情,但是去除监听一般很少去干,最近项目中需要监听页面显示或者隐藏 代码如下 document.addEventListener(visibilitychange', ...

  10. 漫谈碎片化学习(Fragmentation learning)

    碎片化学习(Fragmentation Learning) 从一个互联网小段子讲起: 某天,美国情报部门FBI应奥巴马的要求,做相关汇报:“报告总统,经FBI分析,中国‘短信’中35%是节日祝福语,2 ...