1801 蹄子剪刀布
分析:
- 暴力枚举六种情况,取最大值,比较容易想到
#include<bits/stdc++.h>
using namespace std;
const int N = 101;
int a[N];
int b[N];
//枚举
int main() {
int n;
cin>>n;
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
}
//枚举六种情况
//1石头 2剪刀 3布
int ans = 0;
for (int i = 0; i < n; i++) {
int m = a[i];
int n = b[i];
if ((m == 1 && n == 2) || (m == 2 && n == 3) || (m == 3 && n == 1)) {
ans++;
}
}
int ans1 = 0;
//1石头 2布 3剪刀
for (int i = 0; i < n; i++) {
int m = a[i];
int n = b[i];
if ((m == 1 && n == 3) || (m == 2 && n == 1) || (m == 3 && n == 2)) {
ans1++;
}
}
int win = max(ans, ans1);
//1剪刀 2布 3石头
int ans2 = 0;
for (int i = 0; i < n; i++) {
int m = a[i];
int n = b[i];
if ((m == 1 && n == 2) || (m == 2 && n == 3) || (m == 3 && n == 1)) {
ans2++;
}
}
win = max(win, ans2);
//1剪刀 2石头 3布
int ans3 = 0;
for (int i = 0; i < n; i++) {
int m = a[i];
int n = b[i];
if ((m == 1 && n == 3) || (m == 2 && n == 1) || (m == 3 && n == 2)) {
ans3++;
}
}
win = max(win, ans3);
//1布 2剪刀 3石头
int ans4 = 0;
for (int i = 0; i < n; i++) {
int m = a[i];
int n = b[i];
if ((m == 1 && n == 3) || (m == 2 && n == 1) || (m == 3 && n == 2)) {
ans4++;
}
}
win = max(win, ans4);
int ans5 = 0;
//1布 2石头 3剪刀
for (int i = 0; i < n; i++) {
int m = a[i];
int n = b[i];
if ((m == 1 && n == 2) || (m == 2 && n == 3) || (m == 3 && n == 1)) {
ans5++;
}
}
win=max(win,ans5);
cout<<win<<endl;
}
- 看了别人写的题解,第二种思路很巧妙,我们发现
-无论1,2,3代表那种手势, (1,2) (2,3) (1,3)之间都存在胜负关系,当我们把编号都减去 1 后,也即三种手势分别为 (0,1,2)时,可以通过 (x+1)%3 获取 x手势的下一个相邻手势
比如(0+1)%3=1 (1+1)%3=2 (2+1)%3=0
然后用a b去记录两种胜负情况,取最大值即可
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int a = 0, b = 0;
for(int i = 0; i < n; ++i) {
int x, y;
cin >> x >> y;
x--, y--;
// 当 x + 1 能赢 x 时
if((x + 1) % 3 == y) a++;
// 当 x 能赢 x + 1 时
if(x == (y + 1) % 3) b++;
}
cout << max(a, b) << endl;
return 0;
}
作者:算法小爱
链接:https://www.acwing.com/solution/content/88041/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。