2019年北理复试上机

1、碎片字符串

形如aabbaaacaa的字符串,可分为五个相同连续字母组成的碎片:'aa','bb','aaa','c','aa',其中每个碎片只出现一次,即该字符串包含'aa','bb','aaa','c'四个碎片,且输出时按字典序排序。

输入:a  输出:a

输入:aabbaaacaa  输出:aa aaa bb c

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
vector<string> v;

bool find(string s)
{
    for (vector<string>::iterator i = v.begin(); i != v.end(); i++)
    {
        if (*i == s)return true;
    }
    return false;
}

int main()
{
    string s;
    cin >> s;
    for (int i = 0; i < s.size(); i++)
    {
        string a = "";
        a += s[i];
        while (i < s.size() - 1)
        {
            if (s[i + 1] != s[i])break;
            i++;
            a += s[i];
        }
        if(!find(a))v.push_back(a);
    }
    sort(v.begin(), v.end());
    for (vector<string>::iterator i = v.begin(); i != v.end(); i++)
    {
        if (i == v.begin())cout << *i;
        else cout << " " << *i;
    }
    cout << endl;
    return 0;
}

2、哈夫曼树

输入n,以及n个数(用,隔开),构造哈夫曼树(不用真的用树来写代码),输出其最小带权路径长度

输入:4  2,4,5,7  输出:35

输入:4  1,1,1,1  输出:8

#include<iostream>
#include<queue>
using namespace std;

int main()
{
    priority_queue<int,vector<int>,greater<int> > q;
    int n, x;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> x;
        q.push(x);
        getchar();
    }
    if (n == 1)
    {
        cout << q.top() << endl;
        return 0;
    }
    int s = 0;
    while (q.size() > 1)
    {
        int a = q.top(); q.pop();
        int b = q.top(); q.pop();
        q.push(a + b);
        s += a + b;
    }
    cout << s << endl;
    return 0;
}

 

 

 

posted @ 2019-08-21 01:44  郭怡柔  阅读(318)  评论(0)    收藏  举报