这个题我首先用的是二维数组,然后冒泡排序,结果时间复杂度过高,运行超时。
接着我参考了@飞翔的荷兰人灬的做法,用到了stl的内容,于是参考了@Jasen_Fu的博客,了解了一下stl的基本运用方法。
容器与迭代器的基础用法可参考:
//1.定义和初始化
vector<int> vec1; //默认初始化,vec1为空
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector<int> vec4(10); //10个值为的元素
vector<int> vec5(10,4); //10个值为的元素
//2.常用操作方法
vec1.push_back(100); //添加元素
int size = vec1.size(); //元素个数
bool isEmpty = vec1.empty(); //判断是否为空
cout<<vec1[0]<<endl; //取得第一个元素
vec1.insert(vec1.end(),5,3); //从vec1.back位置插入个值为的元素
vec1.pop_back(); //删除末尾元素
vec1.erase(vec1.begin(),vec1.end());//删除之间的元素,其他元素前移
cout<<(vec1==vec2)?true:false; //判断是否相等==、!=、>=、<=...
vector<int>::iterator iter = vec1.begin(); //获取迭代器首地址
vec1.clear(); //清空元素
//3.遍历
//下标法
int length = vec1.size();
for(int i=0;i<length;i++)
{
cout<<vec1[i];
}
cout<<endl<<endl;
//迭代器法
vector<int>::const_iterator iterator = vec1.begin();
for(;iterator != vec1.end();iterator++)
{
cout<<*iterator;
}
其中迭代器调用结构体中的值可以是
vector<student>::iterctor iter=v1.begin();
//第一种
cout<<iter->id;
//第二种
cout<<(*iter).id;
具体做法是构造一个结构体,我们可以通过定义四个vector容奇装载四类学生,如下:
struct student
{
char id[10];//学号
int moral;//德分
int talent;//才分
int toge;//总分
};
接着构造一个排序函数,用于排序同类学生如下:
bool cmp(student a,student b)
{
if(a.toge!=b.toge)//比较总分
return a.toge>b.toge;
else
{
if(a.moral!=b.moral)//总分相等比较德分
return a.moral>b.moral;
else
{
/*strcmp是字符串比较函数
相同时返回0,
第一个字符串大时返回正数,
第二个字符串大时返回负数*/
return strcmp(a.id,b.id)<0;
}
}
}
最后就需要按顺序遍历四类学生即可,全部代码如下:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
struct student
{
char id[10];//学号
int moral;//德分
int talent;//才分
int toge;//总分
};
bool cmp(student a,student b)
{
if(a.toge!=b.toge)//比较总分
return a.toge>b.toge;
else
{
if(a.moral!=b.moral)//总分相等比较德分
return a.moral>b.moral;
else
{
/*strcmp是字符串比较函数
相同时返回0,
第一个字符串大时返回正数,
第二个字符串大时返回负数*/
return strcmp(a.id,b.id)<0;
}
}
}
int main(void)
{
student stus;
vector<student> v1,v2,v3,v4;
int n,l,h;
int sum=0;
scanf("%d%d%d",&n,&l,&h);
for(int i=0;i<n;i++)
{
scanf("%s%d%d",stus.id,&stus.moral,&stus.talent);
stus.toge=stus.moral+stus.talent;
if(stus.moral>=l&&stus.talent>=l)
{
sum++;
if(stus.moral>=h&&stus.talent>=h)
v1.push_back(stus);
else if(stus.moral>=h&&stus.talent<h)
v2.push_back(stus);
else if(stus.moral<h&&stus.talent<h&&stus.moral>=stus.talent)
v3.push_back(stus);
else
v4.push_back(stus);
}
}
//按照自定义的函数排序
sort(v1.begin(),v1.end(),cmp);
sort(v2.begin(),v2.end(),cmp);
sort(v3.begin(),v3.end(),cmp);
sort(v4.begin(),v4.end(),cmp);
printf("%d\n",sum);
vector<student>::iterator iter; //迭代器遍历vector
for(iter=v1.begin();iter!=v1.end();iter++)
printf("%s %d %d\n",iter->id,iter->moral,iter->talent);
for(iter=v2.begin();iter!=v2.end();iter++)
printf("%s %d %d\n",iter->id,iter->moral,iter->talent);
for(iter=v3.begin();iter!=v3.end();iter++)
printf("%s %d %d\n",iter->id,iter->moral,iter->talent);
for(iter=v4.begin();iter!=v4.end();iter++)
printf("%s %d %d\n",iter->id,iter->moral,iter->talent);
return 0;
}
//运行时间: 55 ms 占用内存:2916K