洛谷P1328生活大爆炸版石头剪刀布

1. 题目描述

题目过长且有图表,在此展示不便。

详细内容见原题地址

2. Notes

  1. 这题在传统的石头剪刀布上又增加了两种情况,如果单纯的用if条件判断,代码将会非常长,而且有可能会有疏忽。因此,一种简单的思路就是制作得分表,正如题目中的那张,需要注意的是,制作表时已经要分清楚谁相对与谁的结果,比如题目中的表就是甲相对于乙的结果。

  2. 第1条也启发我们,今后遇到需要很多条件判断时,可以考虑制表来解决,制表一时累,然后一直爽。

  3. 得分表只需存储01用来表示输赢,因此建议用char型二维数组,可以省空间。

  4. 一种比较优雅的初始化表的方式:(引用别人的,不用在意数据,这种形式码代码的时候应该会更加省力)。

    1
    2
    3
    4
    5
    6
    int vs[5][5] = 
    {{0,0,1,1,0},
    {1,0,0,1,0},
    {0,1,0,0,1},
    {0,0,1,0,1},
    {1,1,0,0,0}}; //得分表的处理

3. 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
using namespace std;
int main(){
int s1=0,s2=0,N,n1,n2,i,t1,t2;
int a[201],b[201];
char r[5][5];
memset(r,0,sizeof(r));
r[0][2]=r[0][3]
=r[1][0]=r[1][3]
=r[2][1]=r[2][4]
=r[3][2]=r[3][4]
=r[4][0]=r[4][1]=1;
cin>>N>>n1>>n2;
for(i=0;i<n1;i++) cin>>a[i];
for(i=0;i<n2;i++) cin>>b[i];
for(i=0;i<N;i++){
t1=a[i%n1];
t2=b[i%n2];
if(t1!=t2){
if(r[t1][t2]){
s1++;
}else{
s2++;
}
}
}
cout<<s1<<" "<<s2;
return 0;
}