Submission #147678

#TimeUsernameProblemLanguageResultExecution timeMemory
147678함수컵 최고~ (#201)Get Hundred Points! (FXCUP4_hundred)C++17
100 / 100
9 ms464 KiB
#include "hundred.h"
#include <bits/stdc++.h>

using namespace std;

int ans[110];
int sco[110];
int pos[110][3][3];
string his[110];

int good(int ans[]) {
    for (int i=0;i<100;i++) {
        int c = 0;
        for (int j=0;j<100;j++) {
            c += (his[i][j]==ans[j]+'A');
        }
        if (c!=sco[i]) return 0;
    }
    return 1;
}

std::string GetHundredPoints(int A, int B, int C) {
    int ch = -1;
    if (A==100) ch = 'A';
    else if (B==100) ch ='B';
    else if (C==100) ch = 'C';
    if (~ch) {
        string s;
        for (int i=0;i<100; i++) s.push_back(ch);
        return s;
    }
    int num[] = {A,B,C}, rev = 0;
    if (!A) {
        num[0]=B;
        num[1]=C;
        num[2]=A;
        rev = 1;
    }
    string que;
    for (int i=0;i<3;i++) {
        for (int j=0;j<num[i];j++) que.push_back('A'+(i+rev)%3);
    }
    int base = Mark(que);
    sco[0] = base;
    his[0] = que;
    for (int i=num[0];i<100;i++) {
        swap(que[0],que[i]);
        his[i] = que;
        int m = Mark(que);
        for (int j=0;j<3;j++) {
            for (int k=0;k<3;k++) {
                int val = (int)(j+'A'==que[0])+(int)(k+'A'==que[i])-(int)(j+'A'==que[i])-(int)(k+'A'==que[0]);
                if (val==m-base) {
                    pos[i][j][k] = 1;
                }
            }
        }
        sco[i] = m;
        swap(que[0],que[i]);
    }
    for (int i=1;i<num[0];i++){
        swap(que[i],que[num[0]]);
        his[i] = que;
        int m = Mark(que);
        for (int j=0;j<3;j++) {
            for (int k=0;k<3;k++) {
                int val = (int)(j+'A'==que[i])+(int)(k+'A'==que[num[0]])-(int)(j+'A'==que[num[0]])-(int)(k+'A'==que[i]);
                if (val==m-base) {
                    pos[i][j][k] = 1;
                }
            }
        }
        sco[i] = m;
        swap(que[i],que[num[0]]);
    }
    int gpos[] = {1,1,1};
    for (int c=0;c<3;c++) {
        ans[0] = c;
        for (int i=num[0];i<100;i++){
            int p = -1;
            for (int j=0;j<3;j++) {
                if (pos[i][c][j]) {
                    p=j;
                    break;
                }
            }
            if (p<0) {
                gpos[c] = 0;
                break;
            }
            ans[i] = p;
        }
        if (!gpos[c]) continue;
        for (int i=1;i<num[0];i++) {
            int p = -1;
            for (int j=0;j<3;j++) {
                if (pos[i][j][ans[num[0]]]) {
                    p=j;
                    break;
                }
            }
            if (p<0) {
                gpos[c] = 0;
                break;
            }
            ans[i] = p;
        }
        if (!gpos[c]) continue;
        if (good(ans)) {
            string tmp;
            for (int i=0;i<100;i++) tmp.push_back(ans[i]+'A');
            return tmp;
        }
    }

    return string();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...