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; }

浙公网安备 33010602011771号