记录 【PAT乙级】题解-1018 锤子剪刀布 冗余逻辑精简过程。
AC - 最高奥义
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 胜平负记录一个甲的,乙的直接逆序输出即可
int s = 0, p = 0, f = 0;
int ac = 0, aj = 0, ab = 0;
int bc = 0, bj = 0, bb = 0;
while(n --) { C J B
char a, b;
cin >> a >> b;
if(a == 'C') {
if(b == 'C') {
p ++;
} else if(b == 'J') {
s ++;
ac ++;
} else if(b == 'B') {
f ++;
bb ++;
}
} else if(a == 'J') {
if(b == 'C') {
f ++;
bc ++;
} else if(b == 'J') {
p ++;
} else if(b == 'B') {
s ++;
aj ++;
}
} else if(a == 'B') {
if(b == 'C') {
s ++;
ab ++;
} else if(b == 'J') {
f ++;
bj ++;
} else if(b == 'B') {
p ++;
}
}
}
cout << s << " " << p << " " << f << endl;
cout << f << " " << p << " " << s << endl;
// ab ac aj
if(ab == ac && ab == aj) cout << "B ";
else if(ac == aj && ac > ab) cout << "C ";
else if(ab == aj && ac > ab) cout << "C ";
else if(ab == aj && ab > ac) cout << "B ";
else {
if(ab > ac && ab > aj) cout << "B ";
if(ac > ab && ac > aj) cout << "C ";
if(aj > ab && aj > ac) cout << "J ";
}
// bb bc bj
if(bb == bc && bb == bj) cout << "B" << endl;
else if(bc == bj && bc > bb) cout << "C" << endl;
else if(bb == bj && bc > bb) cout << "C" << endl;
else if(bb == bj && bb > bc) cout << "B" << endl;
else {
if(bb > bc && bb > bj) cout << "B" << endl;
if(bc > bb && bc > bj) cout << "C" << endl;
if(bj > bb && bj > bc) cout << "J" << endl;
}
return 0;
}
冗余逻辑 1
确定甲、乙获胜次数最多的手势,如果解不唯一,则输出按字母序最小的解( B > C > J B>C>J B>C>J)。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 胜平负记录一个甲的,乙的直接逆序输出即可
int s = 0, p = 0, f = 0;
int ac = 0, aj = 0, ab = 0;
int bc = 0, bj = 0, bb = 0;
while(n --) {
char a, b;
cin >> a >> b;
if(a == 'C') {
if(b == 'C') {
p ++;
} else if(b == 'J') {
s ++;
ac ++;
} else if(b == 'B') {
f ++;
bb ++;
}
} else if(a == 'J') {
if(b == 'C') {
f ++;
bc ++;
} else if(b == 'J') {
p ++;
} else if(b == 'B') {
s ++;
aj ++;
}
} else if(a == 'B') {
if(b == 'C') {
s ++;
ab ++;
} else if(b == 'J') {
f ++;
bj ++;
} else if(b == 'B') {
p ++;
}
}
}
cout << s << " " << p << " " << f << endl;
cout << f << " " << p << " " << s << endl;
// ab ac aj
if(ab >= aj && ab >= ac) cout << "B ";
else if(ac >= aj && aj > ab) cout << "C ";
else if(ac > ab && ab >= aj) cout << "C ";
else if(aj > ab && aj > ac) cout << "J ";
// bb bc bj
if(bb >= bj && bb >= bc) cout << "B" << endl;
else if(bc >= bj && bj > bb) cout << "C" << endl;
else if(bc > bb && bb >= bj) cout << "C" << endl;
else if(bj > bb && bj > bc) cout << "J" << endl;
return 0;
}
冗余逻辑 2
确定甲、乙获胜次数最多的手势。如果解不唯一,则输出按字母序最小的解( B > C > J B>C>J B>C>J)。
合并优化代码逻辑:
- 输出 B B B,因字母序中 B B B 最小,均可取等, 满足 B ≥ C a n d B ≥ J B≥C and B≥J B≥CandB≥J 即可, C 、 J C、J C、J 的顺序无关;
- 输出 C C C,因字母序中 B B B 最小, C C C 不可取等于 B B B,满足 C > B a n d C ≥ J C>B and C≥J C>BandC≥J)即可, B 、 J B、J B、J 的顺序无关;
- 输出 J J J,因字母序中 J J J 最大,均不可取等,满足 J > B a n d J > C J>B and J>C J>BandJ>C)即可, B 、 C B、C B、C 的顺序无关;
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 胜平负记录一个甲的,乙的直接逆序输出即可
int s = 0, p = 0, f = 0;
int ac = 0, aj = 0, ab = 0;
int bc = 0, bj = 0, bb = 0;
while(n --) {
char a, b;
cin >> a >> b;
if(a == 'C') {
if(b == 'C') {
p ++;
} else if(b == 'J') {
s ++;
ac ++;
} else if(b == 'B') {
f ++;
bb ++;
}
} else if(a == 'J') {
if(b == 'C') {
f ++;
bc ++;
} else if(b == 'J') {
p ++;
} else if(b == 'B') {
s ++;
aj ++;
}
} else if(a == 'B') {
if(b == 'C') {
s ++;
ab ++;
} else if(b == 'J') {
f ++;
bj ++;
} else if(b == 'B') {
p ++;
}
}
}
cout << s << " " << p << " " << f << endl;
cout << f << " " << p << " " << s << endl;
// ab ac aj
if(ab >= aj && ab >= ac) cout << "B ";
else if(ac >= aj && ac > ab) cout << "C ";
else if(aj > ab && aj > ac) cout << "J ";
// bb bc bj
if(bb >= bj && bb >= bc) cout << "B" << endl;
else if(bc >= bj && bc > bb) cout << "C" << endl;
else if(bj > bb && bj > bc) cout << "J" << endl;
return 0;
}
优化 AC - 高追求
合并优化 s、p、f
代码逻辑,代码缩减到
54
54
54 行。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 胜平负记录一个甲的,乙的直接逆序输出即可
int s = 0, p = 0, f = 0;
int ac = 0, aj = 0, ab = 0;
int bc = 0, bj = 0, bb = 0;
while(n --) {
char a, b;
cin >> a >> b;
if(a == b) {
p ++;
} else if(a == 'C' && b == 'J') {
s ++;
ac ++;
} else if(a == 'J' && b == 'B') {
s ++;
aj ++;
} else if(a == 'B' && b == 'C') {
s ++;
ab ++;
} else if(b == 'C' && a == 'J') {
f ++;
bc ++;
} else if(b == 'J' && a == 'B') {
f ++;
bj ++;
} else if(b == 'B' && a == 'C') {
f ++;
bb ++;
}
}
cout << s << " " << p << " " << f << endl;
cout << f << " " << p << " " << s << endl;
// ab ac aj
if(ab >= aj && ab >= ac) cout << "B ";
else if(ac >= aj && ac > ab) cout << "C ";
else if(aj > ab && aj > ac) cout << "J ";
// bb bc bj
if(bb >= bj && bb >= bc) cout << "B" << endl;
else if(bc >= bj && bc > bb) cout << "C" << endl;
else if(bj > bb && bj > bc) cout << "J" << endl;
return 0;
}