PTA_7—3一帮一

一.题目内容:

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

输入格式:

输入第一行给出正偶数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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

二.题目思路

        1.题目默认是男女一比一,因此我们要做的时选定一个合适的存储方式,该存储方式能够让我们同时在数据开头和数据尾部同时检测匹配是否有合适异性一对一,我采用的是双向链表的方式来记录数据

       2.在初始化链表的时候,我定义了三个指针,一个头指针,一个尾指针,还有一个用于跟踪当前节点的指针。前两者用于定位,第三者则是在添加数据的时候用到。(想法很粗糙,因该有可以优化的地方,如果有什么更好的方法,可以发到评论区一起讨论)

三.示例代码

#include
using namespace std;
typedef struct List
{
    struct List* prior;  前指针
    struct List* next;   后指针
    string m_name;       姓名
    int sex;             性别
}List;

int main()
{
    int totalnum = 0;
    List* head = new List;
    List* tail = new List;
    List* track = head;     追踪指针,跟进最新插入的节点
    cin >> totalnum;       
    head->next = tail;
    head->prior = NULL;        确定首尾指针的关系
    tail->next = NULL;
    tail->prior = head;
    while (totalnum--)
    {
        List* p = new List;
        cin >> p->sex;
        p->prior = NULL;
        p->next = NULL;
        cin >> p->m_name;
        p->prior = track;
        p->next = tail;
        track->next = p;     
        tail->prior = p;
        track = p;             更新track指针
    }
    List* p = head->next;
    List* q = tail->prior;
    while (q != p->next)               终止条件就是两指针相邻
    {
        while (p->sex == q->sex)
        {
            q = q->prior;
        }
        cout << p->m_name << " " << q->m_name << endl;
        List* m = p;
        List* n = q;
        p->next->prior = p->prior;
        p->prior->next = p->next;    在这里删除匹配的两个节点
        delete m;
        q->next->prior = q->prior;
        q->prior->next = q->next;
        delete n;
        p = head->next;                     在这里head 和 tail指针用于重新定位p和q
        q = tail->prior;
    }
    cout << p->m_name << " " << q->m_name << endl;
    return 0;
}

 

你可能感兴趣的:(算法,数据结构,c++)