Ranking (as of 2013-01-19): 74
Language: C++
/* UVa 608 - Counterfeit Dollar To build using Visual Studio 2008: cl -EHsc -O2 UVa_608_Counterfeit_Dollar.cpp */ #include <cstdio> #include <cstring> const int nr_coins_max = 'L' - 'A' + 1, nr_weighings = 3; struct weighing { char left_coins_[nr_coins_max + 1], right_coins_[nr_coins_max + 1]; int result_; // 1 for "up", 0 for "even", -1 for "down" }; bool weigh_coins(char coin, int light_or_heavy /* 1 for light, -1 for heavy */, weighing& w) { int left_weight = 0, right_weight = 0; for (const char* p = w.left_coins_; *p; p++) if (*p == coin) { left_weight = light_or_heavy; break; } for (const char* p = w.right_coins_; *p; p++) if (*p == coin) { right_weight = light_or_heavy; break; } return (right_weight == left_weight && !w.result_ || right_weight > left_weight && w.result_ > 0 || right_weight < left_weight && w.result_ < 0) ? true : false; } int main() { bool coins[nr_coins_max]; // coins[i] is true if coin of 'A' + i is used for the weighings weighing weighings[nr_weighings]; int t; scanf("%d", &t); while (t--) { memset(coins, 0, sizeof(coins)); for (int i = 0; i < nr_weighings; i++) { char result[nr_coins_max + 1]; scanf("%s %s %s", weighings[i].left_coins_, weighings[i].right_coins_, result); for (const char *p = weighings[i].left_coins_; *p; p++) coins[*p - 'A'] = true; for (const char *p = weighings[i].right_coins_; *p; p++) coins[*p - 'A'] = true; weighings[i].result_ = ((!strcmp(result, "even")) ? 0 : ((!strcmp(result, "up")) ? 1 : -1)); } for (int i = 0; i < nr_coins_max; i++) if (coins[i]) { int j; // see if the coin of 'A' + i is the heavy counterfeit for (j = 0; j < nr_weighings; j++) if (!weigh_coins('A' + i, -1, weighings[j])) break; if (j == nr_weighings) { printf("%c is the counterfeit coin and it is heavy.\n", 'A' + i); break; } // see if the coin of 'A' + i is the light counterfeit for (j = 0; j < nr_weighings; j++) if (!weigh_coins('A' + i, 1, weighings[j])) break; if (j == nr_weighings) { printf("%c is the counterfeit coin and it is light.\n", 'A' + i); break; } } } return 0; }
No comments:
Post a Comment