简单的算法问题1——塑泥课
以下题目全是用C++写的…
以下算法题均来自计蒜客
小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过 250250 立方厘米的等量橡皮泥,教大家做泥塑。在上课过程中,她发现每个班都恰好有一个小朋友会去抢另一个小朋友的橡皮泥,于是她决定,在正式开始做泥塑前,让大家把手里的橡皮泥都捏成一个立方体,并且测量手里捏好的橡皮泥的长、宽和高。这样,她就可以知道谁被谁抢了橡皮泥了。
输入格式
小米老师在不同的学期可能会带一个班或者同时带多个班,因此输入数据可能有一组或者多组。
每组输入数据的第一行为一个整数 nn,表示了这个班的小朋友数,之后 nn 行每行包括了由空格分隔的三个整数和一个字符串,那个字符串表示了小朋友的名字,前面三个整数则是这个学生手里橡皮泥块的长、宽、高数据。按照幼儿园的规定,每个班最多有 99 个小朋友,最少也要有 22 个小朋友,每个小朋友在学籍系统中的名称不超过 88 个字符长。当出现一个班级的小朋友数为 -1−1 时,表示没有更多的班级了。
输出格式
输出行数与小米老师带的班级数相同,形式为X took clay from Y.,具体请参考样例输出。
形如:
输入
3 //代表你班级的人数
10 10 2 Jill //学生类输入的格式
5 3 10 Will
5 5 10 Bill
4
2 4 10 Cam
4 3 7 Sam
8 11 1 Graham
6 2 7 Pam
-1 //退出
输出
Bill took clay from Will.
Graham took clay from Cam.
刨坑点
1.那个学生的数组是用二位吗?
答:看你自己,我用的是一个一维数组表示的而数组
2.那个输出的人是怎么确定到底是谁拿走了谁的塑泥?
答其实很简单学生的塑泥之间体积比较大小很有可能就是最多的那个人拿走了最少的那个人的。(我觉得这样思维,也不是很严谨,但是这就是答案~~)
代码
#include <iostream>
#include <string>
using std:: string;
class student{
private:
int length;
int wide;
int high;
string name;
public:
student(){
length=0;
wide=0;
high=0;
name="\0";
}
void SetStudent(int length,int wide,int high,string name){
if(length*wide*high<251){//塑泥的体积不超过250
if(name.length()<9){//名字的长度不能超过8
this->length=length;
this->wide=wide;
this->high=high;
this->name=name;
}
}
}
string GetName(){
return name;
}
int GetVolume(){
return length*wide*high;
}
};
using namespace std;
int main(){
int n,x=1;
int i,j=0;
int length;
int wide;
int high;
string name;
student *stu;
stu=new student[99];
student min;
student max;
while(true){
cin>>n;
if(n>1||n<10){//一个班的学生必须要至少2个,不超过9个
for(i=0;i<n;i++){
cin>>length;
cin>>wide;
cin>>high;
cin>>name;
stu[j*10+i].SetStudent(length,wide,high,name);
}
j++;
}
if(n==-1){//退出
break;
}
}
for(n=0;n<j-1;n++){
min=stu[n*10+0];
max=stu[n*10+0];
for(x=0;stu[n*10+x].GetName()!="\0";x++){
if(stu[n*10+x].GetVolume()<min.GetVolume()){
min=stu[n*10+x];
}
if(stu[n*10+x].GetVolume()>max.GetVolume()){
max=stu[n*10+x];
}
}
cout<<max.GetName()<<" took clay from "<<min.GetName()<<"."<<endl;
}
return 0;
}
测试成功~