題目: “一幫一學習小組”是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠後的學生排在一組。本題就請你編寫程式幫助老師自動完成這個分配工作,即在得到全班學生的排名後,在當前尚未分組的學生中,將名次最靠前的學生與名次最靠後的異性學生分為一組。 輸入格式: 輸入第一行給出正偶數N(≤5 ...
題目:
“一幫一學習小組”是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠後的學生排在一組。本題就請你編寫程式幫助老師自動完成這個分配工作,即在得到全班學生的排名後,在當前尚未分組的學生中,將名次最靠前的學生與名次最靠後的異性學生分為一組。
輸入格式:
輸入第一行給出正偶數N
(≤50),即全班學生的人數。此後N
行,按照名次從高到低的順序給出每個學生的性別(0代表女生,1代表男生)和姓名(不超過8個英文字母的非空字元串),其間以1個空格分隔。這裡保證本班男女比例是1:1,並且沒有併列名次。
輸出格式:
每行輸出一組兩個學生的姓名,其間以1個空格分隔。名次高的學生在前,名次低的學生在後。小組的輸出順序按照前面學生的名次從高到低排列。
輸入樣例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
輸出樣例:
Amy Jack
Tom Linda
Bill Maya
Cindy John
思路:
將所有學生的性別按輸入順序存入數組sex,女生按輸入順序存入一個vector girl,男生按輸入順序存入一個vector boy。遍曆數組sex,如果當前元素為零,輸出girl的第一個元素和boy的最後一個元素,同時移除girl的第一個元素和boy的最後一個元素;如果當前元素為一,輸出boy的第一個元素和girl的最後一個元素,同時移除boy的第一個元素和girl的最後一個元素。
知識點for me:
1、*(vec.end()-1)獲取vector的最後一個元素。end()指向末尾元素的下一個元素。
2、pop_back()可以刪除vector的最後一個元素,而函數erase()可以刪除由一個iterator指出的元素,也可以刪除一個指定範圍的元素。
下麵是vector中常用的插入和刪除操作,轉自https://blog.csdn.net/lixiaogang_theanswer/article/details/78143375
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count個元素ele. push_back(ele); //尾部插入元素ele pop_back();//刪除最後一個元素 erase(const_iterator start, const_iterator end);//刪除迭代器從start到end之間的元素 erase(const_iterator pos);//刪除迭代器指向的元素 clear();//刪除容器中所有元素
迭代器用於erase刪除元素後,其後會失效,即不能再用該迭代器操作向量。如,例子中的k,當再次用來刪除向量的元素後,就會報錯。
vector< int > vecInt; vector< int >::iterator k = vecInt.begin(); vecInt.erase(k); // 刪除第一個元素 //vecInt.erase(k); 迭代器k已經失效,會出錯 vecInt.erase(vecInt.begin(),vecInt.end()); // 刪除所有元素
上代碼:
#include <vector> #include <iostream> using namespace std; int main() { int n; cin >> n; int sex; string name; vector<string> girl; vector<string> boy; int stu[n]; for(int i=0;i<n;i++) { cin>>sex; cin>>name; stu[i]=sex; if(sex==0) girl.push_back(name); if(sex==1) boy.push_back(name); } int g=0,b=0; for(int i=0;i<n/2;i++){ if(stu[i]==0) { cout<<girl[g]<<" "<<*(boy.end()-1)<<endl; boy.pop_back(); g++; } else { cout<<boy[b]<<" "<<*(girl.end()-1)<<endl; girl.pop_back(); b++; } } return 0; }