1 条题解

  • 0
    @ 2022-10-12 9:13:05

    这题不知道如果暴力去其他人的字符串里查是否能完成。这里提供的做法是把字符串转换成一个对应的 26 进制整数(因为保证了长度相同,所以可以直接 a ~ z 变换成 0 ~ 25)。然后用三个数组表示每个人有哪些字符串出现过。

    需要注意多组数据时要及时清空数组,保证上一组数据不会影响到当前数据。

    这题学过 map 的同学可能会想到使用 map<string,int> 来处理。但需要注意,map 的查询修改这些操作的时间复杂度都是 O(logN)O(\log N) 而不是 O(1)O(1) 的哟!

    #include <bits/stdc++.h>
    using namespace std;
    int t, n;
    string temp;
    //储存字符串对应的整数
    int a[1005], b[1005], c[1005];
    //储存每个整数是否出现过
    bool aa[26 * 26 * 26 + 5];
    bool bb[26 * 26 * 26 + 5];
    bool cc[26 * 26 * 26 + 5];
    //每个人的得分
    int a_score, b_score, c_score;
    //将参数转换为对应的整数
    int s2i(string s)
    {
        return (s[0] - 'a') * 26 * 26 +
               (s[1] - 'a') * 26 +
               (s[2] - 'a');
    }
    int main()
    {
        cin >> t;
        while (t--)
        {
            //输入
            cin >> n;
            for (int i = 1; i <= n; i++)
            {
                cin >> temp;
                a[i] = s2i(temp);
                aa[a[i]] = true;
            }
            for (int i = 1; i <= n; i++)
            {
                cin >> temp;
                b[i] = s2i(temp);
                bb[b[i]] = true;
            }
            for (int i = 1; i <= n; i++)
            {
                cin >> temp;
                c[i] = s2i(temp);
                cc[c[i]] = true;
            }
            //统计得分
            a_score = b_score = c_score = 0;
            for (int i = 1; i <= n; i++)
            {
                int cnt = 1; // 几个人有a[i]
                if (bb[a[i]])
                    cnt++;
                if (cc[a[i]])
                    cnt++;
                //计分
                if (cnt == 1)
                    a_score += 3;
                if (cnt == 2)
                    a_score += 1;
            }
            for (int i = 1; i <= n; i++)
            {
                int cnt = 1; // 几个人有b[i]
                if (aa[b[i]])
                    cnt++;
                if (cc[b[i]])
                    cnt++;
                //计分
                if (cnt == 1)
                    b_score += 3;
                if (cnt == 2)
                    b_score += 1;
            }
            for (int i = 1; i <= n; i++)
            {
                int cnt = 1; // 几个人有c[i]
                if (aa[c[i]])
                    cnt++;
                if (bb[c[i]])
                    cnt++;
                //计分
                if (cnt == 1)
                    c_score += 3;
                if (cnt == 2)
                    c_score += 1;
            }
            //输出
            cout << a_score << " " << b_score << " " << c_score << "\n";
            //清空,准备做下一组数据
            for (int i = 1; i <= n; i++)
                aa[a[i]] = false;
            for (int i = 1; i <= n; i++)
                bb[b[i]] = false;
            for (int i = 1; i <= n; i++)
                cc[c[i]] = false;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1095
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    26
    已通过
    8
    上传者