PTA 6-3 对象指针与对象数组(拉丁舞)

题目:

对象指针与对象数组(拉丁舞)

怡山小学毕业文艺晚会上,拉丁舞是最受欢迎的节目。不过,每年为了排练这个节目,舞蹈组都会出现一些纠纷。有些同学特别受欢迎,有些却少人问津,因此安排舞伴成为舞蹈组陈老师最头疼的问题。

为了解决这一问题,今年陈老师决定让按先男生后女生,先低号后高号的顺序,每个人先报上自己期待的舞伴,每人报两位,先报最期待的舞伴。接下来按先男生后女生,先低号后高号的顺序,依次按以下规则匹配舞伴:

(1)每个人均按志愿顺序从前到后确定舞伴。如果第一志愿匹配不成功,则考虑第二志愿。

(2)如果A的当前志愿为B,则如果B未匹配舞伴,且有以下情形之一者,A和B匹配成功:

​ 2a) B的期待名单中A。

​ 2b) B的期待名单中没有A,但B期待的两位舞伴均已匹配成功,所以B只能与A凑合。

输入时先输入男生数m, 接下来m行,第一项为学生的姓名,后两项为期待舞伴的编号,编号从0开始,最大为女生数减1。接下来输入女生数f,接下来f行,第一项为学生的姓名,后两项为期待舞伴的编号,编号从0开始,最大为男生数减1。

输出时按男生的编号顺序输出  姓名:舞伴姓名

注意两个姓名间有冒号隔开

###函数接口定义:


Student的两个成员函数:
void printPair();
void addPair();    

裁判测试程序样例:


#include <iostream>
#include <string>
using namespace std;
const int K=2;
const int N=20;
class Student{
  string name;
  Student *welcome[K];
  Student *pair;
  public:
      void init(string &name, Student *a, Student *b) {
        this->name=name; 
        welcome[0]=a;
        welcome[1]=b;
        pair=NULL;
      }
     void printPair();
     void addPair();        
};

/* 请在这里填写答案 */

int main(){
    Student male[N], female[N];
    int m, f, i, j, a, b;
    string name;
    cin>>m;
    for(i=0;i<m;i++){
      cin>>name>>a>>b;
      male[i].init(name, &female[a], &female[b]);
    }
    cin>>f;
    for(i=0;i<f;i++){
      cin>>name>>a>>b;
      female[i].init(name, &male[a], &male[b]);
    }
    for(i=0;i<m;i++) male[i].addPair();
    for(i=0;i<f;i++) female[i].addPair();
    for(i=0;i<m;i++) male[i].printPair();
    return 0;
}

输入样例:

5
M0 3 1
M1 1 3
M2 1 4
M3 3 1
M4 0 3
5
F0 0 2
F1 2 0
F2 2 1
F3 2 4
F4 3 2

输出样例:

M0:F1
M2:F4
M4:F0

说明:匹配过程如下:

(1)M0先选择F3, 但F3并未期待M0;接下来M0选择F1, F1也期待M0,故匹配成功。

(2)M1选择F1, 但F1已匹配,故,不成功;M1选择F3,但F3未期待M1,仍然不成功。

(3)M2选择F1,F1已匹配;M2选择F4, F4未匹配且也期待M2,故匹配成功。

(4)M3选择F3,但F3未期待他,不成功;M3选择F1,F1已匹配,不成功。

(5)M4选择F0, F0不期待M4,但是F0期待的M0和M2已分配,所以凑合,匹配成功。

(6)F0已匹配, F1已匹配。

(7)F2选择M2, M2已匹配,不成功; F2选择M1, M1未匹配,但期待表中没有F2,且F3也未分配,故不成功。

(8)F3选择M2, M2已匹配,不成功;F3选择M4, M4已匹配,不成功。

(9)F4已匹配。

代码:

void Student::addPair()
{
    if (pair) return;
    for (int i = 0; i < 2;i ++)
    {
        if (!welcome[i]->pair)
        {
            if (welcome[i]->welcome[0] == this || welcome[i]->welcome[1] == this)
            {
                pair = welcome[i];
                welcome[i]->pair = this;
                return;
            }
            else if (welcome[i]->welcome[0]->pair && welcome[i]->welcome[1]->pair)
            {
                pair = welcome[i];
                welcome[i]->pair = this;
                return;
            }
        }
    }
}

void Student::printPair()
{
    if (!pair)
        return;
    cout << name << ":" << pair->name << endl;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值