daily pastebin goal
83%
SHARE
TWEET

labos

a guest Jun 13th, 2018 49 in 16 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.math.BigDecimal;
  4. import java.math.RoundingMode;
  5. import java.nio.file.Files;
  6. import java.nio.file.Paths;
  7. import java.text.DecimalFormat;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.stream.Collectors;
  11.  
  12. public class CF {
  13.  
  14.     static int N, M, Q;
  15.     static List<Row> rows = new ArrayList<>();
  16.     static List<Row> rows_T = new ArrayList<>();
  17.     static  DecimalFormat df = new DecimalFormat("#.000");
  18.  
  19.     public static void main(String[] args) throws IOException {
  20.         BufferedReader reader = Files.newBufferedReader(Paths.get(args[0]));
  21.  
  22.         String[] parts = reader.readLine().split(" ");
  23.         N = Integer.parseInt(parts[0]);
  24.         M = Integer.parseInt(parts[1]);
  25.  
  26.         for (int i = 0; i < N; i++) {
  27.             Row row = new Row(reader.readLine().split(" "));
  28.             rows.add(row);
  29.         }
  30.  
  31.         for (int i = 0; i < M; i++) rows_T.add(new Row());
  32.         for (int i = 0; i < M; i++) {
  33.             for (Row row: rows) {
  34.                 rows_T.get(i).values.add(row.values.get(i));
  35.             }
  36.         }
  37.         rows_T.forEach(Row::average);
  38.  
  39.         Q = Integer.parseInt(reader.readLine());
  40.  
  41.         for (int i = 0; i < Q; i++) {
  42.             parts = reader.readLine().split(" ");
  43.             int I = Integer.parseInt(parts[0]);
  44.             int J = Integer.parseInt(parts[1]);
  45.             int T = Integer.parseInt(parts[2]);
  46.             int K = Integer.parseInt(parts[3]);
  47.  
  48.             calculate(I, J, T, K);
  49.         }
  50.     }
  51.  
  52.  
  53.     public static void calculate(int I, int J, int T, int K) {
  54.         List<Row> temp;
  55.         if (T == 0) temp = new ArrayList<>(rows);
  56.         else temp = new ArrayList<>(rows_T);
  57.         Row row = temp.get(I - 1);
  58.         temp.forEach(r -> r.calcCos(row));
  59.         temp.sort((r1,r2) -> Double.compare(r2.cos, r1.cos));
  60.         temp  = temp.subList(1, K + 1);
  61.         temp = temp.stream().filter(r -> r.cos > 0).collect(Collectors.toList());
  62.         double brojnik = temp.stream().mapToDouble(r -> r.cos * r.values.get(J - 1).value).sum();
  63.         double nazivnik = temp.stream().mapToDouble(r -> r.cos).sum();
  64.         double result = brojnik/nazivnik;
  65.         BigDecimal bd = new BigDecimal(result);
  66.         BigDecimal res = bd.setScale(3, RoundingMode.HALF_UP);
  67.         System.out.println(df.format(res));
  68.     }
  69.  
  70.  
  71. }
  72.  
  73. enum ValueType {
  74.     NONE, INT;
  75. }
  76.  
  77. class Value {
  78.  
  79.     ValueType type;
  80.     int value = 0;
  81.  
  82.     public Value(ValueType type, int value) {
  83.         this.value = value;
  84.         this.type = type;
  85.     }
  86.  
  87.     public Value(ValueType type) {
  88.         this.type = type;
  89.     }
  90.  
  91. }
  92.  
  93. class Row {
  94.  
  95.     List<Value> values = new ArrayList<>();
  96.     int sum = 0;
  97.     double average = 0;
  98.     double cos = 0;
  99.  
  100.     public Row(){}
  101.  
  102.     public Row(String[] parts) {
  103.         int n = 0;
  104.         for (String part : parts) {
  105.             Value value;
  106.             if (part.equals("X")) value = new Value(ValueType.NONE);
  107.             else {
  108.                 int v = Integer.parseInt(part);
  109.                 value = new Value(ValueType.INT, v);
  110.                 sum += v;
  111.                 n++;
  112.             }
  113.             values.add(value);
  114.         }
  115.         average = (double)sum/(double)n;
  116.     }
  117.  
  118.  
  119.     public void average(){
  120.         int n = 0;
  121.         for (Value value : values ) {
  122.             if (value.type == ValueType.INT) {
  123.                 sum += value.value;
  124.                 n++;
  125.             }
  126.         }
  127.         average = (double)sum/(double)n;
  128.     }
  129.  
  130.  
  131.     public void calcCos(Row row) {
  132.         double brojnik = 0;
  133.         double mA = 0, mB = 0;
  134.  
  135.         for (int i = 0; i < values.size(); i++) {
  136.             double a = values.get(i).type == ValueType.INT ? values.get(i).value - average : 0;
  137.             double b = row.values.get(i).type == ValueType.INT ? row.values.get(i).value - row.average: 0;
  138.             brojnik += a * b;
  139.             mA += a * a;
  140.             mB += b * b;
  141.         }
  142.  
  143.         mA = Math.sqrt(mA); mB = Math.sqrt(mB);
  144.         cos = brojnik/(mA * mB);
  145.     }
  146.  
  147.  
  148. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top