PAT-1063 Set Similarity

1063 Set Similarity

part 4, 4.0

自己解法

  • 一开始第二个循环里面写了三个循环,然后发现最后一个过不了,就将三个循环优化为一个循环,就过了
#include <iostream>
using namespace std;
#include <vector>
#include <map>
#include <algorithm>

int main()
{
    int N, M;
    cin >> N;
    vector<map<int, int>> n(N); // map的集合
    for (int i = 0; i < N; i++)
    {
        cin >> M;
        map<int, int> m;
        for (int j = 0; j < M; j++)
        {
            int x;
            cin >> x;
            map<int, int>::iterator pos = m.find(x);
            if (pos == m.end())
                m.insert(make_pair(x, 1));
            else
                pos->second++;
        }
        n[i] = m;
    }
    int K;
    cin >> K;
    for (int i = 0; i < K; i++)
    {
        int a, b;
        cin >> a >> b;
        int count = 0;
        map<int, int> m = n[a - 1];
        for (map<int, int>::iterator it = n[b - 1].begin(); it != n[b - 1].end(); it++)
        {
            map<int, int>::iterator pos = m.find(it->first);
            if (pos == m.end())
                m.insert(make_pair(it->first, 1)); // 找不到是0
            else
            {
                pos->second = 0; // 找得到就是0
                count++;
            }
        }
        double rate = double(count) / m.size() * 100;
        printf("%.1f%\n", rate);
    }
    system("pause");
    return 0;
}

大神解法

  • 柳神
  • 用set确实更快
#include <cstdio>
#include <vector>
#include <set>
using namespace std;
int main() {
    int n, m, k, temp, a, b;
    scanf("%d", &n);
    vector<set<int>> v(n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &m);
        set<int> s;
        for(int j = 0; j < m; j++) {
            scanf("%d", &temp);
            s.insert(temp);
        }
        v[i] = s;
    }
    scanf("%d", &k);
    for(int i = 0; i < k; i++) {
        scanf("%d %d", &a, &b);
        int nc = 0, nt = v[b-1].size();
        for(auto it = v[a-1].begin(); it != v[a-1].end(); it++) {
            if(v[b-1].find(*it) == v[b-1].end())
                nt++;
            else
                nc++;
        }
        double ans = (double)nc / nt * 100;
        printf("%.1f%%\n", ans);
    }
    return 0;
}
上一篇:2021牛客暑期多校训练营4 F. Just a joke(思维)


下一篇:【2021/09/24】每日总结