表格计算

某次无聊中, 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. 设计模式系列之适配器模式(Adapter Pattern)——不兼容结构的协调

    模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...

  2. Oracle用decode函数或CASE-WHEN实现自定义排序

    1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字.时间.字符串等都有自己默认的排序规则.有时候需要按自己的想法来排 ...

  3. js 前端向服务器端传送文件的常用请求方式

    在做项目的过程当中写到文件上传的功能,想着之前也是踩坑过来的,就在这里总结下自己常用的方法吧.我们现在一般都是通过ajax来搭起前后端数据交互的桥梁,但是大家在做到有文件需要上传的时候就会发现我们用a ...

  4. JDBC基本使用方法

    JDBC基本使用方法 JDBC固定步骤: 加载驱动 String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true& ...

  5. redis主从同步及手动处理故障

    redis主从同步 redis主库机器故障,手动切换主从库

  6. charles 抓包iOS模拟器 HTTPS请求

    参考: https://www.jianshu.com/p/3bfae9ede35e https://www.jianshu.com/p/171046d9f4f9 https://www.jiansh ...

  7. HDU3829 Cat VS Dog

    题目链接:https://vjudge.net/problem/HDU-3829 题目大意: 有\(P\)个小孩,\(N\)只猫,\(M\)只狗.每个小孩都有自己喜欢的某一只宠物和讨厌的某一只宠物(其 ...

  8. Collection接口和list,set子类

    Collection接口常用的子接口有:List接口.Set接口List接口常用的子类有:ArrayList类.LinkedList类Set接口常用的子类有:HashSet类.LinkedHashSe ...

  9. Xilinx的DocNav文件导航中的文档开头字母缩写都是什么意思?

    在安装Xilinx的开发软件后都会附带安装一个用于查阅Xilinx技术文档的文件导航工具DocNav. 在DocNav中可以找到几乎所有对我们开发Xilinx FPGA有用的技术文档,其中的文档数量更 ...

  10. 第3章_关系数据库标准语言(SQL)_006_由元组关系演算到SQL Command_001_蕴含式 (其中有对EXISTS的分析)

    前序的链接:元组关系演算 六. 蕴含式 ===>1. 什么是“蕴含式”===>设p.q为两个命题.复合命题“如果p,则q”称为p与q的蕴含式,记作p→q,并称p为蕴含式的前件,q为后件.定 ...