Google APAC 2015 University Graduates Test A

这道题非常无节操:..
简单的位运算+一些特殊情况的判断:..
最最关键的地方其实是, 求出所有可能值之后, 先判断是否该值和无法确认好坏的段有交, 其次对每一个可能值计算最终显示值
如果全部一样, 那就是无歧义显示:..
我的代码复杂度是n

写出代码

..:
#include <bits/stdc++.h>
using namespace std;
struct res {
    int w, g, x;
};
typedef vector<int> vi;
typedef vector<res> vr;
#define pb push_back
#define all(c) (c).begin(), (c).end()

int T;
int d[10]={126, 48, 109, 121, 51, 91, 95, 112, 127, 123};
int main(void) {
    scanf("%d", &T);
    for (int t=1; t<=T; t++) {
        vi m[101];
        vr r;
        int n, g, x, c, f, l[101];
        char w[8];
        scanf("%d", &n);
        for (int i=0; i<n; i++) {
            c=0;
            scanf("%s", w);
            for (int j=6; j>=0; j--) if (w[j]=='1') c|=1<<(6-j);     
            for (int j=0; j<10; j++) if ((d[j]|c)==d[j]) m[i].pb(j); 
            l[i]=c;                                                  
        }
        for (int i=0; i<m[0].size(); i++) {                         
            f=m[0][i];
            g=(~l[0])&d[f];                                        
            x=l[0]&d[f];
            c=(f+9)%10;                                           
            for (int j=1; j<n; j++, c=(c+9)%10) {
                if (!binary_search(all(m[j]), c)) {
                    goto next;
                } else {
                    g|=(~l[j])&d[c];                                
                    x|=l[j]&d[c];
                }
            }
            for (int k=0; k<n; k++) if (g&l[k])
                goto next;
            r.pb((res){c, g, x});
next:;
        }
        if (r.size()) {
            f=1;
            for (int i=0; f && i<r.size(); i++) if (d[r[i].w]&(~(r[i].g|r[i].x)))
                f=0;
            if (f) {
                c=d[r[0].w]&(~r[0].g)&r[0].x;
                for (int i=1; f && i<r.size(); i++) if ((d[r[i].w]&(~r[i].g)&r[i].x)!=c)
                    f=0;
                if (f) {
                    printf("Case #%d: ", t);
                    cout<<bitset<7>(c)<<endl;
                } else {
                    printf("Case #%d: ERROR!\n", t);
                }
            } else {
                printf("Case #%d: ERROR!\n", t);
            }
        } else {
            printf("Case #%d: ERROR!\n", t);
        }
    }
}


No comments :

Post a Comment