Ranking (as of 2014-08-02): 105 out of 629
Language: C++
/* UVa 812 - Trade on Verweggistan To build using Visucal Studio 2012: cl -EHsc UVa_812_Trade_on_Verweggistan.cpp */ #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int w_max = 50, b_max = 20; int boxes[w_max], max_profits[w_max]; int profits[w_max][b_max]; // profits[i][j] is the accumulated profits up to j-th pile of i-th workyard bool pruls[w_max + 1][w_max * b_max + 1]; // pruls[][i] is true if i pruls have to be bought to get the max. profits int main() { const int price = 10; for (int wn = 1; ; wn++) { int w; scanf("%d", &w); if (!w) break; if (wn > 1) putchar('\n'); int max_p = 0; for (int i = 0; i < w; i++) { scanf("%d", &boxes[i]); max_profits[i] = -1; for (int j = 0, k = 0; j < boxes[i]; j++) { int p; scanf("%d", &p); p = price - p; k += p; profits[i][j] = k; max_profits[i] = max(max_profits[i], k); } #ifdef DEBUG printf("%d:", max_profits[i]); for (int j = 0; j < boxes[i]; j++) printf(" %d", profits[i][j]); putchar('\n'); #endif if (max_profits[i] >= 0) max_p += max_profits[i]; } pruls[0][0] = true; int pi = 0, sb = 0; for (int i = 0; i < w; i++) if (max_profits[i] >= 0) { pi++; for (int k = 0; k <= sb + boxes[i]; k++) pruls[pi][k] = false; if (!max_profits[i]) for (int k = 0; k <= sb; k++) if (pruls[pi - 1][k]) pruls[pi][k] = true; for (int j = 0; j < boxes[i]; j++) if (profits[i][j] == max_profits[i]) for (int k = 0; k <= sb; k++) if (pruls[pi - 1][k]) pruls[pi][k + j + 1] = true; sb += boxes[i]; #ifdef DEBUG for (int k = 0; k <= sb; k++) if (pruls[pi][k]) printf("%d ", k); putchar('\n'); #endif } printf("Workyards %d\n", wn); printf("Maximum profit is %d.\n", max_p); printf("Number of pruls to buy:"); for (int i = 0, j = 0; i <= sb && j < 10; i++) if (pruls[pi][i]) { printf(" %d", i); j++; } putchar('\n'); } return 0; }
No comments:
Post a Comment