鱼C论坛

 找回密码
 立即注册
查看: 2310|回复: 1

L1-030 一帮一

[复制链接]
发表于 2020-9-28 12:30:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

输入格式:
输入第一行给出正偶数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[N];

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[i].sex >> stu[i].name;
        if(boy_s == -1 && stu[i].sex == 1)
            boy_s = i;
        if(girl_s == -1 && stu[i].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[i].sex == 1)
            boy_e = i;
        if (girl_e == -1 && stu[i].sex == 0)
            girl_e = i;
    }

    int index = 0;
    while(boy_s <= boy_e || girl_s <= girl_e){
        int current_sex = stu[index].sex, search_sex = 1 - stu[index].sex;
        cout << stu[index].name << " " << (current_sex == 1 ? stu[girl_e].name : stu[boy_e].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[start].sex == 1)
            return start;
    return -1;
}

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

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

int search_girl_e(int i){
    for (int end = i - 1; end >= 0; end--)
        if (stu[end].sex == 0)
            return end;
    return -1;
}
我的思路就是用四个指针,两个指向排名最前的男生和女生,两个指向排名最后的男生和女生,然后每输出一对就把相应的额指针移位,直到指针相遇之后结束循环。

只有最后一个一分的测试点死活过不去,不知道是哪个细节出了问题,求指教啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-29 06:53:32 From FishC Mobile | 显示全部楼层
两个指针就行了,一个指针开头,一个指向结尾,你可以先选一个成绩好的男生,再选女生,也可以反过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 03:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表