KY196 复数集合
描述
一个复数(x+iy)集合,两种操作作用在该集合上: 1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE; 2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE; 最开始要读入一个int n,表示接下来的n行每一行都是一条命令。
代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
struct Complex {
int real;
int imag;
Complex(int a, int b) : real(a), imag(b) {}
};
bool operator< (Complex r, Complex l) {
return r.real * r.real + r.imag * r.imag < l.real * l.real + l.imag * l.imag;
}
int main() {
priority_queue<Complex> pcom;
int n;
cin >> n;
for (int q = 0; q < n; q++) {
string s;
cin >> s;
if (s == "Pop") {
if (pcom.empty())
cout << "empty" << endl;
else {
printf("%d+i%d\n", pcom.top().real, pcom.top().imag);
pcom.pop();
printf("SIZE = %d\n", pcom.size());
}
} else {
int a, b;
scanf("%d+i%d", &a, &b);
Complex C(a, b);
pcom.push(C);
printf("SIZE = %d\n", pcom.size());
}
}
return 0;
}
KY188 哈夫曼树
描述
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和的最小值。
代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
int main() {
int n;
cin >> n;
priority_queue<int, vector<int>, greater<int> > MyPro;
for (size_t i = 0; i < n; i++) {
int x;
cin >> x;
MyPro.push(x);
}
int answer = 0;
while (1 < MyPro.size()) {
int a = MyPro.top();
MyPro.pop();
int b = MyPro.top();
MyPro.pop();
answer += a + b;
MyPro.push(a + b);
}
cout << answer;
return 0;
}
Catch The Cow
思路
用广度优先搜索的方式来访问所有可能性
广度优先搜索用一个队列来实现
将第一个节点入队,再将它的相邻节点入队,直到队列为空或找到结果
广度优先搜索一般用于寻找最优解
代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
struct info {
int pos;
int time;
};
int main() {
int n, k;
cin >> n >> k;
queue<info> qi;
info i;
i.pos = n;
i.time = 0;
qi.push(i);
bool visit[100001];
for (int i = 0; i < 100001; i++) {
visit[i] = false;
}
while (qi.empty() == false) {
info cur = qi.front();
qi.pop();
if (cur.pos == k) {
cout << cur.time;
break;
}
info i1;
if (cur.pos - 1 >= 0 && cur.pos - 1 <= 100001 && visit[cur.pos - 1] == false) {
i1.pos = cur.pos - 1;
i1.time = cur.time + 1;
qi.push(i1);
}
if (cur.pos + 1 >= 0 && cur.pos + 1 <= 100001 && visit[cur.pos + 1] == false) {
i1.pos = cur.pos + 1;
i1.time = cur.time + 1;
qi.push(i1);
}
if (cur.pos * 2 >= 0 && cur.pos * 2 <= 100001 && visit[cur.pos * 2] == false) {
i1.pos = cur.pos * 2;
i1.time = cur.time + 1;
qi.push(i1);
}
}
return 0;
}
Find The Multiple
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
int main() {
int n;
while (true) {
cin >> n;
if (n == 0)
break;
queue<long long> Myq;
Myq.push(1);
while (!Myq.empty()) {
long long cur = Myq.front();
Myq.pop();
if (cur % n == 0) {
cout << cur << endl;
break;
}
Myq.push(cur * 10);
Myq.push(cur * 10 + 1);
}
}
return 0;
}
KY12 玛雅人的密码
描述
玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1.如果无论移位多少次都解不开密码,输出-1。
代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
struct Node {
string s;
int count;
Node(string s, int count):s(s), count(count){}
};
bool Myfind(vector<string> s, Node n) {
for (int i = 0; i < s.size(); i++) {
if (s[i] == n.s)
return true;
}
return false;
}
int bfs(Node n1) {
queue<Node> qn1;
vector<string> visit;
qn1.push(n1);
while (!qn1.empty()) {
if (Myfind(visit, qn1.front()) == true) {
qn1.pop();
continue;
}
if (qn1.front().s.find("2012") != -1) {
return qn1.front().count;
}
else {
Node cur = qn1.front();
visit.push_back(cur.s);
qn1.pop();
for (int i = 0; i < cur.s.size() - 1; i++) {
Node temp = cur;
swap(temp.s[i], temp.s[i + 1]);
temp.count++;
qn1.push(temp);
}
}
}
return -1;
}
int main() {
int n;
string s;
cin >> n;
cin >> s;
Node n1(s, 0);
cout << bfs(n1);
return 0;
}