L1-030 一帮一
程序员文章站
2023-12-25 15:58:33
题目: “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。 输入格式: 输入第一行给出正偶数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中常用的插入和删除操作,转自
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; }