腾讯游戏客户端岗位笔试

Posted by LudoArt on August 17, 2019

一共五道,后面几题连题目都没仔细看,只记得前面三道。

第一道:

有n个不大于m的数,可以将三个数分为一组,求最多可以分为几个组(n,m均为大于等于1的整数)。

可以分到一组内的条件有两个,符合其中一个即可:

  1. 三个数相同;

  2. 三个数是连续的自然数。

示例输入:

8 6 3 5 5 3 4 3 3 3

示例输出:

3

解释:333为一组,345为一组,345为一组。

第二道:

给n个三角形,问n个三角形中有几对全等三角形(两个三角形为全等三角形,则有一对)

示例输入:

3 0 0 1 0 0 1 0 0 0 1 1 1 0 0 2 0 1 1

示例输出:

1

解释:3代表要输入三行数据,每行为一个三角形在直角坐标系中的坐标(输入顺序为x1, y1, x2, y2, x3, y3)

第三道:

假设你在做一个RPG游戏,需要设计一个背包系统,背包中可以装物品,也可以装背包,物品有它固有的重量,而背包的重量为背包自身的重量再加上背包中物品的重量,背包除了重量这一属性外,还有属性:最大承重,背包的重量不能超过其最大承重。补全以下代码。

示例输入:

1 1 0 5 10

示例输出:

5

解释:第一行的1代表接下来要输入1行数据,每行数据为1个物品。第二行代表一个物品,四个参数假设成为t, k, w, mx,t为1代表物品为袋子,k代表层数(k层的物品要放入k-1层中的最后一个袋子,k=0有且仅有一个物品,即袋子),w为重量,mx为袋子的最大承重。输出整个袋子的重量。

示例输入:

3 1 0 1 11 2 1 3 2 1 4

示例输出:

8

解释:第一行的3代表接下来要输入3行数据,每行数据为1个物品。第二行代表一个物品,三个参数假设成为t, k, w,t为2代表物品为普通物品,k代表层数(k层的物品要放入k-1层中的最后一个袋子),w为重量。输出整个袋子的重量为8(袋子自身的重量为1,袋子里有两个物品,其重量分别为3和4)。

示例输入:

4 1 0 1 11 2 1 3 1 1 3 4 2 2 2

示例输出:

invalid

解释:袋子A的重量为1,袋子A里有一个物品(第二行,其重量为3)和一个袋子B(第三行,其重量为3,最大承重为4)。袋子B中有一个物品(第四行,其重量为2),因为B的最大承重为4,其超重了(3+2>4),最后输出为invalid。

#include <iostream>
#include <vector>

class Item {
public:
	/* 编写构造函数、析构函数 */

	virtual int GetWeight() const {
		return weight_;
	}

	virtual bool IsValid() const {
		return true;
	}

private:
	int weight_;
};

class Bag : public Item {
public:
	/* 编写构造函数、析构函数及其他函数 */
	

private:
	std::vector<Item*> items_;
	int maxWeight_;
};

Bag* Parse() {
	/* 编写读入数据的代码 */
	
}

int main() {
	Bag* root = Parse();

	if (root->IsValid())
		std::cout << root->GetWeight() << std::endl;
	else
		std::cout << "invalid";

	delete root;
}

100%AC通过,仅参考。

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

class Item {
public:
	/* 编写构造函数、析构函数 */
	Item(int w) :weight_(w) {};

	virtual ~Item() {};

	virtual int GetWeight() const {
		return weight_;
	}

	virtual bool IsValid() const {
		return true;
	}

private:
	int weight_;
};

class Bag : public Item {
public:
	/* 编写构造函数、析构函数及其他函数 */
	Bag(int w, int mx) :Item(w), maxWeight_(mx) {};

	~Bag() {
		for (int i = 0; i < items_.size(); ++i) {
			delete items_[i];
			items_[i] = NULL;
		}
		items_.clear();
	}

	int GetWeight() const {
		int weight = 0;
		for (int i = 0; i < items_.size(); ++i) {
			weight += items_[i]->GetWeight();
		}
		weight += Item::GetWeight();
		return weight;
	}

	bool IsValid() const {
		if (GetWeight() > maxWeight_) {
			return false;
		}
		else {
			return true;
		}
	};

	void addItem(Item* item) {
		items_.push_back(item);
	}

private:
	std::vector<Item*> items_;
	int maxWeight_;
};

Bag* Parse() {
	/* 编写读入数据的代码 */
	int n;
	cin >> n;
	vector<Bag*> bags(n);
	for (int i = 0; i < n; ++i) {
		int t, k, w, mx;
		cin >> t;
		//下一个物品是袋子
		if (t == 1) {
			cin >> k >> w >> mx;
			Bag* tmpBag = new Bag(w, mx);
			bags[k] = tmpBag;
		}
		//下一个物品是普通item
		else if (t == 2) {
			cin >> k >> w;
			Item* tmpItem = new Item(w);
			bags[k - 1]->addItem(tmpItem);
		}
	}

	static Bag rootBag = *bags[0];
	return &rootBag;
}

int main() {
	Bag* root = Parse();

	if (root->IsValid())
		std::cout << root->GetWeight() << std::endl;
	else
		std::cout << "invalid";

	delete root;
}