2023/03/25 机试学习记录

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值