PAT (Basic Level) Practice 1015 德才論(algorithm sort(begin, end, compare), vector使用
阿新 • • 發佈:2018-12-20
閱讀理解題,讀懂就好
一共有四類學生“才德全盡”、“ 德勝才 ”、“ “才德兼亡”但尚有“德勝才” ”、“過線學生”,儲存資料的方法,可以用結構體陣列,也可以用vector(一種動態陣列)。前者寫起來程式碼量略多佔記憶體大,後者佔記憶體小,程式碼量少
每次將資料讀入後判斷,放入相應的學生類別中
然後輸出之前,還要對其進行德分>才分>學號的比重進行排序
坑點1.輸入輸出資料量很大。—用printf和scanf好
坑點2.資料量大,普通的O(n²)排序會超時,用歸併、快排也行,就是寫起來麻煩,並且還需注意資料的比較。—可以用#include<algorithm>
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;
}