PAT (Basic Level) Practice 1015 德才论(algorithm sort(begin, end, compare), vector使用

乙级1015

在这里插入图片描述
在这里插入图片描述

阅读理解题,读懂就好
一共有四类学生“才德全尽”、“ 德胜才 ”、“ “才德兼亡”但尚有“德胜才” ”、“过线学生”,存储数据的方法,可以用结构体数组,也可以用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;
}

猜你喜欢

转载自blog.csdn.net/a656418zz/article/details/84319589