PAT Basic 1046. 划拳

发布时间 2023-03-22 22:43:19作者: 十豆加日月

PAT Basic 1046. 划拳

1. 题目描述:

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。

2. 输入格式:

输入第一行先给出一个正整数 \(N\)\(≤100\)),随后 \(N\) 行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中是喊出的数字,是划出的数字,均为不超过 100 的正整数(两只手一起划)。

3. 输出格式:

在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。

4. 输入样例:

5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15

5. 输出样例:

1 2

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

除草题,考察基础IO,根据题意编写对局判断子函数即可。

另外有个一直忘记提到的细节,在使用递增/递减运算符时,非必要不使用后缀形式,前缀形式效率更高(因为后缀形式会额外存储一个副本,具体可以Google),这里我使用的都是前缀形式。

My Code:

#include <stdio.h>

int judgeRound(int jiaGuess, int jiaHua, int yiGuess, int yiHua);

int main(void)
{
    int roundNum = 0;
    int jiaCount = 0, yiCount = 0;
    int i=0;
    int jiaGuess=0, jiaHua=0, yiGuess=0, yiHua=0;
    
    scanf("%d", &roundNum);
    
    for(i=0; i<roundNum; ++i)
    {
        scanf("%d%d%d%d", &jiaGuess, &jiaHua, &yiGuess, &yiHua);
        
        switch(judgeRound(jiaGuess, jiaHua, yiGuess, yiHua))
        {
            case 1: //jiaWin
                ++yiCount;
                break;
            case -1: //yiWin
                ++jiaCount;
                break;
            default:
                break;
        }
    }
    
    printf("%d %d\n", jiaCount, yiCount);
    
    return 0;
}

// return 1 means jia Win, -1 means Yi Win, 0 means dogfall
int judgeRound(int jiaGuess, int jiaHua, int yiGuess, int yiHua)
{
    int sum = jiaGuess + yiGuess;
    
    if(jiaHua == sum && yiHua != sum)
    {
        return 1;
    }
    else if(yiHua == sum && jiaHua != sum)
    {
        return -1;
    }
    else
    {
        return 0;
    }
}