【校内训练2019-11-14】宇宙魔方

【题目概括】

现在有一个\(N\times N\times N\)的一个魔方,一开始每一个格子都是\(0\)

每一次可以对一层中的所有数都加上\(X\)点的能量(横竖宽都可以)。

现在给定一个处理好的魔方,但是有一个格子的数值被损坏了。

请你给出损坏格子处理好的数值。

【思路要点】

  • 考虑将给定的魔方还原回去。
  • 每一次都将每一层的最小值都减去。
  • 最后取原来那个魔方位置的值就是给定的答案。
  • 时间复杂度 \(\mathcal O(n^3)\)

【代码】

#include <bits/stdc++.h>

#define FI first
#define SE second
#define REP(i, s, t) for (int i = s; i <= t; i++)
#define PER(i, s, t) for (int i = s; i >= t; i--)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define INF 0x0x3f3f3f3f0x3f3f3f3f

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef long double ld;

template <class T> void chkmax(T& x, T y) { x = max(x, y); }
template <class T> void chkmin(T& x, T y) { x = min(x, y); }

namespace input {
  template <class T>
  void read(T& x) {
    x = 0; char ch = 0; int f = 1;
    for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
    for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
    x *= f;
  }
  void re(int& x) { read(x); }
  void re(ll& x) { read(x); }
  void re(ull& x) { read(x); }
  void re(char& x) { x = getchar(); }
  void re(string& x) { cin >> x; }

  template <class T, class... R>
  void re(T& x, R&... y) {
    re(x), re(y...);
  }
}
using namespace input;

namespace output {
  template <class T>
  void write(T x) {
    if (!x) { putchar('0'); return; }
    if (x < 0) putchar('-'), x = -x;
    static int top, stk[25]; top = 0;
    while (x) stk[++top] = x % 10, x /= 10;
    while (top) putchar(stk[top--] + 48);
  }
  void pr(int x) { write(x); }
  void pr(ll x) { write(x); }
  void pr(ull x) { write(x); }
  void pr(char x) { putchar(x); }
  void pr(string x) { cout << x; }
  void pp() { putchar(' '); }
  void ps() { puts(""); }

  template <class T, class... R>
  void pr(T x, R... y) {
    pr(x), pr(y...);
  }
}
using namespace output;

const int N = 105;

int n, x, y, z;
int a[N][N][N];

int main() {
  re(n);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++) {
        re(a[i][j][k]);
        if (a[i][j][k] == -1)
          x = i, y = j, z = k;
      }
  for (int i = 1; i <= n; i++) {
    int tmp = inf;
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++)
        if (a[i][j][k] >= 0)
          chkmin(tmp, a[i][j][k]);
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++)
        a[i][j][k] -= tmp;
    tmp = inf;
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++)
        if (a[j][i][k] >= 0)
          chkmin(tmp, a[j][i][k]);
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++)
        a[j][i][k] -= tmp;
    tmp = inf;
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++)
        if (a[j][k][i] >= 0)
          chkmin(tmp, a[j][k][i]);
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++)
        a[j][k][i] -= tmp;
  }
  pr(-a[x][y][z] - 1, '\n');
  return 0; 
}

猜你喜欢

转载自www.cnblogs.com/chhokmah/p/11856286.html
今日推荐