1. 程式人生 > >PAT (Basic Level) Practice 1015 德才論(algorithm sort(begin, end, compare), vector使用

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;
}