数据结构与算法A实验七查找

7-1 电话聊天狂人 (25 分)

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

ll Max, ans, cnt; //Max:最多通话次数 ans:通话次数最多的号码 cnt:狂人的人数

int main()
{
    map<ll, ll> mp;
    int n;
    cin >> n;
    while (n--)
    {
        ll a, b;
        scanf("%lld", &a);
        mp[a]++;
        if (mp[a] > Max)
            Max = mp[a];
        scanf("%lld", &b);
        mp[b]++;
        if (mp[b] > Max)
            Max = mp[b];
    }
    for (auto i : mp)
    {
        if (i.second == Max)
        {
            if (cnt == 0)
                ans = i.first;
            cnt++;
        }
    }
    if (cnt == 1)
        cout << ans << " " << Max << endl;
    else
        cout << ans << " " << Max << " " << cnt << endl;
    return 0;
}

7-2 两个有序序列的中位数 (25 分)

#include <bits/stdc++.h>

using namespace std;

int main()
{
    vector<int> a;
    int n;
    cin >> n;
    for (int i = 1; i <= n * 2; i++)
    {
        int x;
        scanf("%d", &x);
        a.push_back(x);
    }
    sort(a.begin(), a.end());
    cout << a[n - 1] << endl;
    return 0;
}

7-3 词频统计 (30 分)

#include <bits/stdc++.h>

using namespace std;
using psi = pair<string, int>;

map<string, int> mp;
vector<psi> a;

bool cmp(psi x, psi y)
{
    if (x.second == y.second)
        return x.first < y.first;
    return x.second > y.second;
}

int main()
{
    char c;
    string s;
    while (~scanf("%c", &c))
    {
        if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c == '_'))
        {
            if (c >= 'A' && c <= 'Z')
                c += 32;
            if (s.length() < 15)
                s += c;
        }
        else if (c == '#' || s.length() > 0)
        {
            mp[s]++;
            s.clear();
            if (c == '#')
                break;
        }
    }
    for (auto i : mp)
    {
        if (i.first.length() > 0)
            a.push_back(i);
    }
    sort(a.begin(), a.end(), cmp);
    int cnt = a.size() * 0.1;
    cout << a.size() << endl;
    for (int i = 0; i < cnt; i++)
        cout << a[i].second << ":" << a[i].first << "\n";
    return 0;
}

7-4 集合相似度 (25 分)

#include <bits/stdc++.h>

using namespace std;

set<int> st[55];

int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int m;
        scanf("%d", &m);
        while (m--)
        {
            int x;
            scanf("%d", &x);
            st[i].insert(x);
        }
    }
    int k;
    cin >> k;
    while (k--)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        int cnt = 0;
        for (auto i : st[a])
        {
            if (st[b].find(i) != st[b].end())
                cnt++;
        }
        double rate = 100.0 * cnt / (st[a].size() + st[b].size() - cnt);
        printf("%.2lf%%\n", rate);
    }
    return 0;
}

7-5 悄悄关注 (25 分)

#include <bits/stdc++.h>

using namespace std;

string s;
set<string> st;
map<string, int> mp;
vector<string> a;

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> s;
        st.insert(s);
    }
    int m;
    cin >> m;
    int sum = 0; //点赞总次数
    for (int i = 0; i < m; i++)
    {
        int x;
        cin >> s;
        scanf("%d", &x);
        sum += x;
        mp[s] = x;
    }
    double ave = 1.0 * sum / m; //平均点赞次数
    for (auto i : mp)
    {
        string name = i.first;
        int cnt = i.second;
        if (i.second > ave && st.find(name) == st.end())
            a.push_back(name);
    }
    if (a.empty())
        printf("Bing Mei You");
    else
    {
        sort(a.begin(), a.end());
        for (auto i : a)
            cout << i << endl;
    }
    return 0;
}

7-6 单身狗 (25 分)

#include <bits/stdc++.h>

using namespace std;

int t[10005];
vector<int> a;
map<int, int> mp;
set<int> st;

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        mp[a] = b;
        mp[b] = a;
    }
    int m;
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        scanf("%d", &t[i]);
        st.insert(t[i]);
    }
    int cnt = 0;
    for (int i = 1; i <= m; i++)
    {
        if (st.find(mp[t[i]]) == st.end())
        {
            cnt++;
            a.push_back(t[i]);
        }
    }
    sort(a.begin(), a.end());
    cout << cnt << endl;
    int flag = 0;
    for (auto i : a)
    {
        if (flag)
            printf(" ");
        printf("%05d", i);
        flag++;
    }
    return 0;
}

7-7 词典 (15 分)

#include <bits/stdc++.h>

using namespace std;

int main()
{
    map<string, string> mp;
    int n, m;
    scanf("%d %d", &n, &m);
    while (n--)
    {
        string a, b;
        cin >> a >> b;
        mp[b] = a;
    }
    while (m--)
    {
        string s;
        cin >> s;
        if (!mp.count(s))
            printf("eh\n");
        else
            cout << mp[s] << endl;
    }
    return 0;
}

7-8 中序遍历树并判断是否为二叉搜索树 (20 分)

#include <bits/stdc++.h>

using namespace std;

struct point
{
    int left;
    int right;
} s[1000];

void mid(int root)
{
    if (root)
    {
        mid(s[root].left);
        a.push_back(root);
        mid(s[root].right);
    }
}

vector<int> a, b;

int main()
{
    int n, root;
    cin >> n >> root;
    if (n == 0)
        printf("Yes\n");
    else
    {
        int r, d, e;
        for (int i = 1; i < n; i++)
        {
            scanf("%d %d %d", &r, &d, &e);
            if (d == 0)
                s[r].left = e;
            else if (d == 1)
                s[r].right = e;
        }
        mid(root);
        for (int i : a)
            printf("%d\n", i);
        b = a;
        sort(b.begin(), b.end());
        int flag = 0;
        for (int i = 0; i < b.size(); i++)
        {
            if (a[i] != b[i])
                flag = 1;
        }
        if (flag == 1)
            printf("No\n");
        else
            printf("Yes\n");
    }
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值