POJ 1303 - Byte Me!

http://poj.org/problem?id=1303

概要

\(N\) 人の子と1人の親で8ビットの値で510ぴったりを狙うブラックジャックをやる。

子はヒットをせず、最初に配られたカードのみで勝負する。

自分は親であり、問題文で指定された規則に従って bytes あるいは nibbles の山から最大4回ヒットする。 ヒットの過程と、子との勝負の結果を Win!, Lose!, Bust! のいずれかで答える。

制約

解法

やるだけ。

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 int read(const string& s)
 6 {
 7   int n = 0;
 8   for (string::const_iterator it = s.begin(); it != s.end(); ++it) {
 9     n = 2*n + *it-'0';
10   }
11   return n;
12 }
13 
14 int main()
15 {
16   for (string s; cin >> s && s != "ENDOFINPUT";) {
17     int N;
18     cin >> N;
19     string x, y;
20     cin >> x >> y;
21     int a = read(x) + read(y);
22     int m = 0;
23     for (int i = 0; i < N; i++) {
24       cin >> x;
25       m = max(m, read(x) + 255);
26     }
27     vector<int> bytes(4), nibbles(4);
28     for (int i = 0; i < 4; i++) {
29       cin >> x;
30       bytes[i] = read(x);
31     }
32     for (int i = 0; i < 4; i++) {
33       cin >> x;
34       nibbles[i] = read(x);
35     }
36     cin >> x;
37 
38     cout << "HAND " << N << endl;
39     vector<int>::const_iterator it = bytes.begin(), jt = nibbles.begin();
40     for (int i = 0; i < 4; i++) {
41       if (a >= m) {
42         break;
43       } else if (a < 382) {
44         a += *it;
45         ++it;
46         cout << "Byte me!" << endl;
47       } else if (a <= 500) {
48         a += *jt;
49         ++jt;
50         cout << "Nibble me!" << endl;
51       } else {
52         break;
53       }
54     }
55     if (a > 510) {
56       cout << "Bust!" << endl;
57     } else if (a >= m) {
58         cout << "Win!" << endl;
59     } else {
60       cout << "Lose!" << endl;
61     }
62   }
63   return 0;
64 }
poj/1303.cc