P8090 [USACO22JAN] Herdle B 题解

· · 题解

可能会有更好的阅读体验

首先,我们得理解题意。

给定两个 3 \times 3 的矩阵,分别是正确答案矩阵和奶牛猜的矩阵。绿色高亮显示位置和品种都正确的奶牛,黄色高亮显示品种正确但位置错误的奶牛,求绿色高亮数量和黄色高亮数量。

位置和品种都正确的奶牛直接判断累计相加就行了,把正确的奶牛排除后,我们可以设置两个计数器数组,分别表示正确答案矩阵和奶牛猜想矩阵中每个品种奶牛的数目(排除正确的奶牛)。

对于每一品种奶牛,题目中说:

如果猜测方阵中有 x 个特定品种的奶牛,并且 答案方阵中有 y \le x 头该品种奶牛(不包括位置正确而得到绿色高亮显示的奶牛),那么猜测方阵的 x 头奶牛中只有 y 头奶牛应该以黄色高亮显示。

所以我们只要取正确答案矩阵和奶牛猜想矩阵中每个品种奶牛排除正确奶牛后的数目的最小值即可。

如果还有不懂得话,可以尝试从下面的代码中理解,但是要杜绝抄袭,洛谷非常重视学术诚信。此类行为将会导致您成为作弊者。 具体细则请查看洛谷社区规则。

#include<bits/stdc++.h>
using namespace std;
char a[4][4], b[4][4];
int green, yellow, rall[27], gall[27];
int main() {
    for(int i = 1; i <= 3; i++)
        for(int j = 1; j <= 3; j++)
            cin >> a[i][j];
    for(int i = 1; i <= 3; i++)
        for(int j = 1; j <= 3; j++)
            cin >> b[i][j];
    for(int i = 1; i <= 3; i++)
        for(int j = 1; j <= 3; j++)
            if(a[i][j] == b[i][j]) green++;
            else {
                rall[a[i][j] - 'A' + 1]++;
                gall[b[i][j] - 'A' + 1]++;
            }
    for(int i = 1; i <= 26; i++) yellow += min(rall[i], gall[i]);
    printf("%d\n%d\n", green, yellow);
    return 0;
}