Ranbo_ 发表于 2020-9-28 12:30:39

L1-030 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

我的代码:
#include <bits/stdc++.h>

using namespace std;

#define N 50
typedef struct STU{
    int sex;
    string name;
} STU;

STU stu;

int search_boy_s(int, int);
int search_girl_s(int, int);
int search_boy_e(int);
int search_girl_e(int);

int main()
{
   
    int n;
    cin >> n;
    int boy_s = -1, girl_s = -1, boy_e = -1, girl_e = -1;
    for (int i = 0; i < n; i++){
      cin >> stu.sex >> stu.name;
      if(boy_s == -1 && stu.sex == 1)
            boy_s = i;
      if(girl_s == -1 && stu.sex == 0)
            girl_s = i;
    }

    for (int i = n - 1; i >= 0; i--){
      if(boy_e != -1 && girl_e != -1)
            break;
      if(boy_e == -1 && stu.sex == 1)
            boy_e = i;
      if (girl_e == -1 && stu.sex == 0)
            girl_e = i;
    }

    int index = 0;
    while(boy_s <= boy_e || girl_s <= girl_e){
      int current_sex = stu.sex, search_sex = 1 - stu.sex;
      cout << stu.name << " " << (current_sex == 1 ? stu.name : stu.name) << endl;
      if(current_sex == 1){
            boy_s = search_boy_s(boy_s, n);
            girl_e = search_girl_e(girl_e);
      }else{
            girl_s = search_girl_s(girl_s, n);
            boy_e = search_boy_e(boy_e);
      }
      index++;
      if(boy_s == -1 && girl_s == -1 && boy_e == -1 && girl_e == -1)
            break;
    }

    system("pause");
    return 0;
}

int search_boy_s(int i, int n){
    for (int start = i + 1; start < n; start++)
      if(stu.sex == 1)
            return start;
    return -1;
}

int search_girl_s(int i, int n){
    for (int start = i + 1; start < n; start++)
      if (stu.sex == 0)
            return start;
    return -1;
}

int search_boy_e(int i){
    for (int end = i - 1; end >= 0; end--)
      if(stu.sex == 1)
            return end;
    return -1;
}

int search_girl_e(int i){
    for (int end = i - 1; end >= 0; end--)
      if (stu.sex == 0)
            return end;
    return -1;
}

我的思路就是用四个指针,两个指向排名最前的男生和女生,两个指向排名最后的男生和女生,然后每输出一对就把相应的额指针移位,直到指针相遇之后结束循环。

只有最后一个一分的测试点死活过不去,不知道是哪个细节出了问题,求指教啊

召唤风云 发表于 2020-9-29 06:53:32

两个指针就行了,一个指针开头,一个指向结尾,你可以先选一个成绩好的男生,再选女生,也可以反过来
页: [1]
查看完整版本: L1-030 一帮一