阅读理解题,读懂就好
一共有四类学生“才德全尽”、“ 德胜才 ”、“ “才德兼亡”但尚有“德胜才” ”、“过线学生”,存储数据的方法,可以用结构体数组,也可以用vector(一种动态数组)。前者写起来代码量略多占内存大,后者占内存小,代码量少
每次将数据读入后判断,放入相应的学生类别中
然后输出之前,还要对其进行德分>才分>学号的比重进行排序
坑点1.输入输出数据量很大。—用printf和scanf好
坑点2.数据量大,普通的O(n²)排序会超时,用归并、快排也行,就是写起来麻烦,并且还需注意数据的比较。—可以用#include<algorithm>
中的sort()函数,这样方便很多
sort()函数的使用:
基本用法1:
void sort( RandomIt first, RandomIt last );
输入数组的第一位和最后一位地址,它会自动进行升序排序,这个方法仅限数组里面仅含一种元素
基本用法2:
void sort( RandomIt first, RandomIt last, Compare comp );
多种元素的数组一般是一个结构体(类),那么对其排序首先必须得有一个比较方法:Compare comp
comp是自己定义的一个bool类型的函数,sort函数使用的时候会调用这个函数,并且传入需要比较的2个参数,再用户对其排序方式自行设定,一般为:
bool comp(elementtype a, elementtype b){……}
大于返回return true,小于返回return false
动态数组vector:
节省空间的一种方法,这里就说一下基本用法:
vector<elementtype> name;//定义一个动态数组,取名name
name.push_back(element)//将一个元素加入vector中
访问其中的元素:
vector的遍历:迭代器
c++迭代器(iterator)详解
vector<elementtype>::iterator iter//创建一个迭代器叫iter
遍历方式:从vector的头(.begin()),直到vector的尾(.end())
iter相当于是指针,所以对其内部元素的指向应该用“->”
for(iter=vec.begin();iter!=vec.end();iter++)
{
printf("%d",iter->num);
}
预备知识讲完,下面是AC代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
struct student{
int num;
int moral;
int talent;
int sum;
};
bool compare(student a,student b);
int main(){
int N,L,H;
scanf("%d %d %d",&N,&L,&H);
student st;
vector<student> s1,s2,s3,s4;
int ok=0;
for(int i = 0;i<N;i++){
scanf("%d %d %d",&st.num,&st.moral,&st.talent);
st.sum = st.moral+st.talent;
if(st.moral>=L&&st.talent>=L){
if(st.moral>=H&&st.talent>=H){//才德全尽放入第一批
s1.push_back(st); ok++;
}else if(st.moral>=H&&st.talent<H){//德到优秀线,才未到放入第二批
s2.push_back(st); ok++;
}else if(st.moral>=st.talent){//均未到优秀线,德不低于才的进入第三批
s3.push_back(st); ok++;
}else{//才大于德 第四批
s4.push_back(st); ok++;
}
}
}
printf("%d\n",ok);
// cout<<"s1:"<<endl;
// for(int i = 0;i<first;i++){
// cout<<s1[i].num<<' '<<s1[i].moral<<' '<<s1[i].talent<<endl;
// }
// cout<<endl;
sort(s1.begin(),s1.end(),compare);
sort(s2.begin(),s2.end(),compare);
sort(s3.begin(),s3.end(),compare);
sort(s4.begin(),s4.end(),compare);
vector<student>::iterator iter;
for(iter = s1.begin(); iter!=s1.end(); iter++){
printf("%d %d %d\n",iter->num,iter->moral,iter->talent);
}
for(iter = s2.begin(); iter!=s2.end(); iter++){
printf("%d %d %d\n",iter->num,iter->moral,iter->talent);
}
for(iter = s3.begin(); iter!=s3.end(); iter++){
printf("%d %d %d\n",iter->num,iter->moral,iter->talent);
}
for(iter = s4.begin(); iter!=s4.end(); iter++){
printf("%d %d %d\n",iter->num,iter->moral,iter->talent);
}
return 0;
}
bool compare(student a,student b){
if(a.sum>b.sum) return true;
else if(a.sum == b.sum){
if(a.moral > b.moral) return true;
else if(a.moral == b.moral){
if(a.num < b.num) return true;
}
}
return false;
}