鱼C论坛

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

L1-030 一帮一

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

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

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

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

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

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

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

  2. using namespace std;

  3. #define N 50
  4. typedef struct STU{
  5.     int sex;
  6.     string name;
  7. } STU;

  8. STU stu[N];

  9. int search_boy_s(int, int);
  10. int search_girl_s(int, int);
  11. int search_boy_e(int);
  12. int search_girl_e(int);

  13. int main()
  14. {
  15.    
  16.     int n;
  17.     cin >> n;
  18.     int boy_s = -1, girl_s = -1, boy_e = -1, girl_e = -1;
  19.     for (int i = 0; i < n; i++){
  20.         cin >> stu[i].sex >> stu[i].name;
  21.         if(boy_s == -1 && stu[i].sex == 1)
  22.             boy_s = i;
  23.         if(girl_s == -1 && stu[i].sex == 0)
  24.             girl_s = i;
  25.     }

  26.     for (int i = n - 1; i >= 0; i--){
  27.         if(boy_e != -1 && girl_e != -1)
  28.             break;
  29.         if(boy_e == -1 && stu[i].sex == 1)
  30.             boy_e = i;
  31.         if (girl_e == -1 && stu[i].sex == 0)
  32.             girl_e = i;
  33.     }

  34.     int index = 0;
  35.     while(boy_s <= boy_e || girl_s <= girl_e){
  36.         int current_sex = stu[index].sex, search_sex = 1 - stu[index].sex;
  37.         cout << stu[index].name << " " << (current_sex == 1 ? stu[girl_e].name : stu[boy_e].name) << endl;
  38.         if(current_sex == 1){
  39.             boy_s = search_boy_s(boy_s, n);
  40.             girl_e = search_girl_e(girl_e);
  41.         }else{
  42.             girl_s = search_girl_s(girl_s, n);
  43.             boy_e = search_boy_e(boy_e);
  44.         }
  45.         index++;
  46.         if(boy_s == -1 && girl_s == -1 && boy_e == -1 && girl_e == -1)
  47.             break;
  48.     }

  49.     system("pause");
  50.     return 0;
  51. }

  52. int search_boy_s(int i, int n){
  53.     for (int start = i + 1; start < n; start++)
  54.         if(stu[start].sex == 1)
  55.             return start;
  56.     return -1;
  57. }

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

  64. int search_boy_e(int i){
  65.     for (int end = i - 1; end >= 0; end--)
  66.         if(stu[end].sex == 1)
  67.             return end;
  68.     return -1;
  69. }

  70. int search_girl_e(int i){
  71.     for (int end = i - 1; end >= 0; end--)
  72.         if (stu[end].sex == 0)
  73.             return end;
  74.     return -1;
  75. }
复制代码

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

只有最后一个一分的测试点死活过不去,不知道是哪个细节出了问题,求指教啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 02:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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