PTAL2-028秀恩爱分得快(无算法,纯编程)

9 篇文章 0 订阅
6 篇文章 0 订阅

PTAL2-028秀恩爱分得快

  • 题目链接PTAL2-029秀恩爱分得快
  • 注意事项:
    • 无算法,纯编程,主要就是性别的处理,亲近度的计算。
    • 记住对照片的输入是要字符串,因为0可能是异性。
    • 二者亲近度都与最大值相等,就输出这对情侣,如果不是相等的,哪怕其中一个人与其他异性的亲近度都是0也要输出(也就是未出现在照片中),测试3就是考这个。
  • 测试点(参考)
10 3
3 1 2 -0
2 3 -4
2 -5 6
7 -8 
  • 代码
#include <iostream>
#include <vector>
using namespace std;

/*
    亲近度相等就输出原来自己,如果不相等就要输出其他最大的,哪怕情侣中一个有拍过照,另一个没有。
    那么这个没有拍过照的,就没出现在照片里,也就是与任何人的亲精度都是0,那也要把所有的异性全部输出,
*/

int gender[1010];       // 存储性别
float closeToOne[1010]; // 存储对第一个人的亲近程度值
float closeToTwo[1010]; // 存储对第二个人的亲近程度值
int N, M, K;
vector<int> List[1010]; // 存储每张相片
int x1, x2;

// 处理输入的图片
void fun1()
{
    string person;
    int length;
    int personNum;
    int picNum = 1;
    int rows = M;
    while (rows--)
    {
        cin >> K;
        while (K--)
        {
            personNum = 0;
            cin >> person;

            // 说明这个数字为负数
            if (person[0] == '-')
            {
                person.erase(0, 1);
                for (auto i : person)
                {
                    personNum = personNum * 10 + int(i) - 48;
                }
                gender[personNum] = -1;
            }
            // 不是负数
            else
            {
                for (auto i : person)
                {
                    personNum = personNum * 10 + int(i) - 48;
                }
                gender[personNum] = 1;
            }
            List[picNum].push_back(personNum);
            // cout << personNum << endl;
        }
        picNum++;
    }
}

// 处理输入的情侣
void fun2(int &x1, int &x2)
{
    string a, b;
    cin >> a >> b;
    int personNum = 0;
    if (a[0] == '-')
    {
        a.erase(0, 1);
        for (auto i : a)
        {
            personNum = personNum * 10 + int(i) - 48;
        }
        gender[personNum] = -1;
    }
    else
    {
        for (auto i : a)
        {
            personNum = personNum * 10 + int(i) - 48;
        }
        gender[personNum] = 1;
    }
    x1 = personNum;

    personNum = 0;
    if (b[0] == '-')
    {
        b.erase(0, 1);
        for (auto i : b)
        {
            personNum = personNum * 10 + int(i) - 48;
        }
        gender[personNum] = -1;
    }
    else
    {
        for (auto i : b)
        {
            personNum = personNum * 10 + int(i) - 48;
        }
        gender[personNum] = 1;
    }
    x2 = personNum;
}

// 处理亲近度的问题
void fun3()
{
    int flag1 = 0, flag2 = 0;
    // 处理每一张照片中人的亲密度
    for (int i = 1; i <= M; i++)
    {
        flag1 = 0;
        flag2 = 0;
        for (auto k : List[i])
        {
            if (k == x1)
            {
                flag1 = 1;
            }
            else if (k == x2)
            {
                flag2 = 1;
            }
        }

        // 看看情侣两人或者其中一人是否在照片中出现。
        if (flag1 && flag2)
        {
            for (auto k : List[i])
            {
                if (gender[k] != gender[x1])
                {
                    closeToOne[k] += 1.0 / List[i].size();
                }
                else
                {
                    closeToTwo[k] += 1.0 / List[i].size();
                }
            }
        }
        else if (flag1 == 1)
        {
            for (auto k : List[i])
            {
                if (gender[k] != gender[x1])
                {
                    closeToOne[k] += 1.0 / List[i].size();
                }
            }
        }
        else if (flag2 == 1)
        {
            for (auto k : List[i])
            {

                if (gender[k] != gender[x2])
                {
                    closeToTwo[k] += 1.0 / List[i].size();
                }
            }
        }
    }
}

//找最大亲密度
void fun4()
{
    void fun5(int a, int b);
    float maxToOne = 0;
    float maxToTwo = 0;
    for (int i = 0; i < N; i++)
    {
        if (gender[i] != gender[x1])
        {
            maxToOne = max(maxToOne, closeToOne[i]);
        }
        if (gender[i] != gender[x2])
        {
            maxToTwo = max(maxToTwo, closeToTwo[i]);
        }
    }

    // 这样写测试点3错误,如果情侣从来没拍过照片,那么与其他人的亲近度都是0。
    // if (maxToOne == closeToOne[x2] && maxToTwo == closeToTwo[x1] && maxToOne != 0 && maxToTwo != 0)

    if (maxToOne == closeToOne[x2] && maxToTwo == closeToTwo[x1]) 
    {
        // cout << "相亲相爱" << endl;
        fun5(x1, x2);
    }
    else
    {
        for (int i = 0; i < N; i++)
        {
            if (gender[i] != gender[x1] && closeToOne[i] == maxToOne)
            {
                fun5(x1, i);
            }
        }
        for (int i = 0; i < N; i++)
        {
            if (gender[i] != gender[x2] && closeToTwo[i] == maxToTwo)
            {
                fun5(x2, i);
            }
        }
    }
}

// 专门打印符号所用的
void fun5(int a, int b)
{
    if (gender[a] == -1)
    {
        cout << "-" << a << " ";
    }
    else
    {
        cout << a << " ";
    }

    if (gender[b] == -1)
    {
        cout << "-" << b << endl;
    }
    else
    {
        cout << b << endl;
    }
}

int main()
{

    cin >> N >> M;
    fun1();

    fun2(x1, x2);
    // cout << x1 << " " << x2 << endl;
    fun3();
    // for (int i = 0; i < N; i++)
    // {
    //     cout << closeToOne[i] << endl;
    // }

    // for (int i = 0; i < N; i++)
    // {
    //     cout << closeToTwo[i] << endl;
    // }
    fun4();
    return 0;
}
/*
10 3
3 1 2 -0
2 3 -4
2 -5 6
7 -8 
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值