题解 | Median-2019牛客暑期多校训练营第三场I题

题目来源于牛客竞赛:https://ac.nowcoder.com/acm/contest/discuss
题目描述:
题解 | Median-2019牛客暑期多校训练营第三场I题
输入描述:
题解 | Median-2019牛客暑期多校训练营第三场I题
输出描述:
题解 | Median-2019牛客暑期多校训练营第三场I题
示例1:
题解 | Median-2019牛客暑期多校训练营第三场I题
题解:
题解 | Median-2019牛客暑期多校训练营第三场I题
代码:

#include <bits/stdc++.h> 
using namespace std;
int T,N,a[100010];
int v[100010][3];
bool f[100010][3][3];
int ans[100010];
typedef pair<int,int> pii;
int from[100010][3][3];

int med(int x,int y,int z) {
    static int tmp[3];
    tmp[0] = x; tmp[1] = y; tmp[2] = z;
    sort(tmp,tmp+3);
    return tmp[1];
}

void gao(int i,int j,int k) {
    while(i >= 1) {
        ans[i] = v[i][j];
        int nxt = from[i][j][k];
        j = k;
        k = nxt;
        i--;
    }
}

int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&N);
        for (int i=2;i<N;i++) {
            scanf("%d",&a[i]);
        }
        a[0] = a[1] = a[2];
        a[N + 1] = a[N] = a[N - 1];
        for (int i=1;i<=N;i++) {
            for (int j=0;j<3;j++) {
                v[i][j] = a[i - 1 + j];
            }
            sort(v[i], v[i] + 3);
        }
        for (int i=1;i<=N;i++) {
            for (int j=0;j<3;j++) {
                for (int k=0;k<3;k++) {
                    f[i][j][k] = false;
                }
            }
        }
        for (int i=0;i<3;i++) {
            for (int j=0;j<3;j++) {
                f[2][i][j] = true;
            }
        }
        bool findans = false;
        for (int i=3;i<=N;i++) {
            for (int j=0;j<3;j++) {
                for (int k=0;k<3;k++) {
                    for (int l=0;l<3;l++) {
                        if (!f[i-1][k][l]) continue;
                        if (med(v[i-2][l], v[i-1][k], v[i][j]) != a[i-1]) {
                            continue;
                        }
                        f[i][j][k] = true;
                        from[i][j][k] = l;
                        break;
                    }
                    if (i == N && f[i][j][k]) {
                        findans = true;
                        gao(i,j,k);
                        goto END;
                    }
                }
            }
        }
        END:
        if (!findans) {
            puts("-1");
        } else {
            for (int i=2;i<N;i++) {
                assert(med(ans[i-1],ans[i],ans[i+1]) == a[i]);
            }
            for (int i=1;i<=N;i++) {
                printf("%d%c",ans[i]," \n"[i==N]);
            }
        }
    }   
}

更多问题,更详细题解可关注牛客竞赛区,一个刷题、比赛、分享的社区。
传送门:https://ac.nowcoder.com/acm/contest/discuss

上一篇:PAT Advanced 1029 Median


下一篇:ambari-server启动出现ERROR main] DBAccessorImpl:106 - Error while creating database accessor java.lang.ClassNotFoundException:com.mysql.jdbc.Driver问题解决办法(图文详解)