Submission #11188

#TimeUsernameProblemLanguageResultExecution timeMemory
11188qja0950Sequence (BOI14_sequence)C++98
100 / 100
148 ms3972 KiB
// // main.cpp // 32 // // Created by KJBS2 on 2014. 11. 18.. // Copyright (c) 2014년 KJBS2. All rights reserved. // #include <stdio.h> #define MAXN 101101 typedef long long ll; int N; int Nr[MAXN]; void INPUT() { scanf("%d", &N); for(int i=0; i<N; i++) { int x; scanf("%d", &x); Nr[i] = (1 << x); } return; } ll Get(int Now[], int n, int pp) { if(n==1) { ll ans = 0; bool iszero = false; if( (Now[0] >> 0) % 2 == 1 ) iszero = true; if(!iszero) { for(int i=1; i<10; i++) { if( (Now[0] >> i) % 2 == 1 ) { ans *= 10; ans += i; } } return ans; }else{ int p = -1; for(int i=1; i<10; i++) if( (Now[0] >> i) % 2 == 1 ) { p = i; break; } if(p == -1) return 10; ans = p * 10; for(int i=p+1; i<10; i++) { if( (Now[0] >> i) % 2 == 1 ) { ans *= 10; ans += i; } } } } if(pp>5) { ll ans = 0; bool iszero = false; for(int j=0; j<n; j++) if( (Now[j] >> 0) % 2 == 1 ) iszero = true; if(!iszero) { for(int i=1; i<10; i++) { for(int j=0; j<n; j++) { if( (Now[j] >> i) % 2 == 1 ) { ans *= 10; ans += i; } } } return ans; }else{ int p = -1; for(int i=1; i<10; i++) { for(int j=0; j<n; j++) if( (Now[j] >> i) % 2 == 1 ) { p = i; break; } if(p != -1) break; } if(p == -1) return 10; ans = p * 10; for(int i=p+1; i<10; i++) { for(int j=0; j<n; j++) { if( (Now[j] >> i) % 2 == 1 ) { ans *= 10; ans += i; } } } } return ans; } int *next; int the_min = MAXN; next = new int [the_min]; ll ans = (ll)(0x7fffffff) * (ll)(0x7fffffff); for(int i=0; i<10; i++) { int nextn = 0; bool empty = true; bool zz = true; int first = 0; for(int j=0; j<10-i && j<n; j++) { int p = i+j; int now = Now[j]; if( (Now[j] >> p) % 2 == 1 ) { now -= (1 << p); if(p == 0) zz = false; } first = (first | now); } if(first != 0) empty = false; next[nextn++] = first; int t = 10-i; for(int j=t; j<n; j+=10) { int first = 0; for(int k=0; k<10 && j+k<n; k++) { int now = Now[j+k]; if( (Now[j+k] >> k) % 2 == 1 ) { now -= (1 << k); if(k == 0) zz = false; } first = (first | now); } if(first != 0) empty = false; next[nextn++] = first; } if(pp==0) { // printf("%d %d\n", i, nextn); } ll get = 0; if(empty == false) get = Get(next, nextn, pp+1); ll nowi = get * 10 + i; if(get == 0 && i == 0 && zz == false) { nowi = 10; } if(ans > nowi) ans = nowi; if(pp==0) { // printf(">%d %lld\n", i, nowi); } } delete [] next; return ans; } int main() { INPUT(); printf("%lld", Get(Nr, N, 0) ); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...