AOJ 0503
じりきで解けなかった。
漸化式作るのむずかしすぎ(頭悪い)
#include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 15; int N, M; int cup[MAX_N]; int main(){ while(scanf("%d %d",&N,&M)&&N!=0){ for(int i=0; i<3; i++){ int K; scanf("%d", &K); for(int j=0; j<K;j++){ int t; scanf("%d", &t); cup[t-1] = i; } } int A[N], C[N], X[N]; X[N-1] = 2; A[N-1] = cup[N-1]; C[N-1] = 2-cup[N-1]; for(int n=N-1; n>0; n--){ X[n-1] = 3*X[n] + 2; switch(cup[n-1]){ case 0: A[n-1] = A[n]; C[n-1] = C[n] + 2 * X[n] + 2; break; case 1: A[n-1] = C[n] + X[n] + 1; C[n-1] = A[n] + X[n] + 1; break; case 2: A[n-1] = A[n] + 2 * X[n] + 2; C[n-1] = C[n]; break; } } int ans = min(A[0], C[0]); ans = (M < ans)?-1:ans; printf("%d\n", ans); } return 0; }