一共五道,后面几题连题目都没仔细看,只记得前面三道。
第一道:
有n个不大于m的数,可以将三个数分为一组,求最多可以分为几个组(n,m均为大于等于1的整数)。
可以分到一组内的条件有两个,符合其中一个即可:
三个数相同;
三个数是连续的自然数。
示例输入:
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;
}