#include <bits/stdc++.h>
using namespace std;
int ROW[] = {+1, -1, +0, +0};
int COL[] = {+0, +0, +1, -1};
int X[] = {+0, +0, +1, -1, -1, +1, -1, +1};
int Y[] = {-1, +1, +0, +0, +1, +1, -1, -1};
int KX[] = {-2, -2, -1, -1, 1, 1, 2, 2};
int KY[] = {-1, 1, -2, 2, -2, 2, -1, 1};
int GCD(int a, int b) { return b == 0 ? a : GCD(b, a % b); }
int LCM(int a, int b) { return a * (b / GCD(a, b)); }
bool CMP(int a, int b) { return a > b; }
template <class T>
inline bool fastread(T &x) {
  int c = getchar();
  int sgn = 1;
  while (~c && c < '0' || c > '9') {
    if (c == '-') sgn = -1;
    c = getchar();
  }
  for (x = 0; ~c && '0' <= c && c <= '9'; c = getchar()) x = x * 10 + c - '0';
  x *= sgn;
  return ~c;
}
int ans[10000007];
int main() {
  int n, i = 1;
  cin >> n;
  vector<int> a;
  for (int I = 0; I < n; I++) {
    int X;
    scanf("%d", &X);
    a.push_back(X);
  };
  sort(a.begin(), a.end());
  ans[0] = a[n - 1];
  for (int j = n - 2; j >= 0; j -= 2) {
    ans[i++] = a[j];
  }
  int j;
  if (n % 2)
    j = 0;
  else
    j = 1;
  for (; j < n - 1; j += 2) {
    ans[i++] = a[j];
  }
  if (ans[0] >= ans[1] + ans[n - 1]) {
    printf("NO\n");
    return 0;
  }
  if (ans[n - 1] >= ans[0] + ans[n - 2]) {
    printf("NO\n");
    return 0;
  }
  for (int i = 1; i < n - 1; i++) {
    if (ans[i] >= ans[i - 1] + ans[i + 1]) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  for (int i = 0; i < n; i++) printf("%d ", ans[i]);
  printf("\n");
  return 0;
}
