Run Time: 0.040
Ranking (as of 2016-10-24): 16 out of 384
Language: C++
/* UVa 11832 - Account Book To build using Visual Studio 2012: cl -EHsc -O2 UVa_11832_Account_Book.cpp */ #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int N_max = 40, F_min = -16000, F_max = 16000; int Ti[N_max + 1]; bool cash_flow[N_max + 1][F_max - F_min + 1][2]; // cash_flow[i][j][0/1] is the cash_flow of j, up to i-th transaction, // with i-th transaction of income (1) or expense (0) char transactions[N_max + 2]; void transaction(int n, int f) { int t = Ti[n]; if (cash_flow[n][f - F_min][0]) { cash_flow[n][f - F_min][0] = false; if (transactions[n] != '?') transactions[n] = (transactions[n] == '+') ? '?' : '-'; #ifdef DEBUG printf("[%d][%d][0]: %c\n", n, f, transactions[n]); #endif if (n > 1) transaction(n - 1, f + t); } if (cash_flow[n][f - F_min][1]) { cash_flow[n][f - F_min][1] = false; if (transactions[n] != '?') transactions[n] = (transactions[n] == '-') ? '?' : '+'; #ifdef DEBUG printf("[%d][%d][1]: %c\n", n, f, transactions[n]); #endif if (n > 1) transaction(n - 1, f - t); } } int main() { while (true) { int N, F; scanf("%d %d", &N, &F); if (!N) break; for (int i = 1; i <= N; i++) scanf("%d", &Ti[i]); memset(cash_flow, 0, sizeof(cash_flow)); int j_min = -Ti[1] - F_min, j_max = Ti[1] - F_min; cash_flow[1][j_min][0] = cash_flow[1][j_max][1] = true; #ifdef DEBUG printf("[1][%d][0] [1][%d][1]\n", j_min + F_min, j_max + F_min); #endif for (int i = 2; i <= N; i++) { int t = Ti[i]; for (int j = j_min; j <= j_max; j++) if (cash_flow[i - 1][j][0] || cash_flow[i - 1][j][1]) { if (j - t >= 0) cash_flow[i][j - t][0] = true; if (j + t <= F_max - F_min) cash_flow[i][j + t][1] = true; } j_min = max(j_min - t, 0), j_max = min(j_max + t, F_max - F_min); #ifdef DEBUG for (int j = j_min; j <= j_max; j++) for (int k = 0; k < 2; k++) if (cash_flow[i][j][k]) printf("[%d][%d][%d] ", i, j + F_min, k); putchar('\n'); #endif } if (cash_flow[N][F - F_min][0] || cash_flow[N][F - F_min][1]) { memset(transactions, 0, sizeof(transactions)); transaction(N, F); puts(transactions + 1); } else puts("*"); } return 0; }
No comments:
Post a Comment