zoukankan      html  css  js  c++  java
  • 蓝桥杯 表格计算 (JAVA模拟 注意细节)

    蓝桥杯 表格计算


    某次无聊中, 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
    ", val[i][m]);
    86         }
    87     }
    88 }
  • 相关阅读:
    [MacOS]Sublime text3 安装(一)
    [RHEL8]开启BBR
    PAT Advanced 1136 A Delayed Palindrome (20分)
    PAT Advanced 1144 The Missing Number (20分)
    PAT Advanced 1041 Be Unique (20分)
    PAT Advanced 1025 PAT Ranking (25分)
    PAT Advanced 1022 Digital Library (30分)
    PAT Advanced 1019 General Palindromic Number (20分)
    PAT Advanced 1011 World Cup Betting (20分)
    PAT Advanced 1102 Invert a Binary Tree (25分)
  • 原文地址:https://www.cnblogs.com/1013star/p/10736668.html
Copyright © 2011-2022 走看看