L2-028 秀恩爱分得快 (25 分)(模拟)

简介: L2-028 秀恩爱分得快 (25 分)(模拟)

古人云:秀恩爱,分得快。


互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些同框照片对应的亲密度之和。下面给定一批照片,请你分析一对给定的情侣,看看他们分别有没有亲密度更高的异性朋友?


输入格式:

输入在第一行给出 2 个正整数:N(不超过1000,为总人数——简单起见,我们把所有人从 0 到 N-1 编号。为了区分性别,我们用编号前的负号表示女性)和 M(不超过1000,为照片总数)。随后 M 行,每行给出一张照片的信息,格式如下:


K P[1] ... P[K]

其中 K(≤ 500)是该照片中出现的人数,P[1] ~ P[K] 就是这些人的编号。最后一行给出一对异性情侣的编号 A 和 B。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。


输出格式:

首先输出 A PA,其中 PA 是与 A 最亲密的异性。如果 PA 不唯一,则按他们编号的绝对值递增输出;然后类似地输出 B PB。但如果 AB 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。


输入样例 1:

1. 10 4
2. 4 -1 2 -3 4
3. 4 2 -3 -5 -6
4. 3 2 4 -5
5. 3 -6 0 2
6. -3 2


输出样例 1:

1. -3 2
2. 2 -5
3. 2 -6


输入样例 2:

1. 4 4
2. 4 -1 2 -3 0
3. 2 0 -3
4. 2 2 -3
5. 2 -1 2 
6. -3 2


输出样例 2:

-3 2


思路:用一个二维数组g来存储在同一张照片的不同人之间的亲密度,maxn来记录和A和异性的最大亲密度和B和异性的最大亲密度,因为题目要求按他们编号的绝对值递增输出,所以我们采用set分别存储男性和女性,最后遍历输出就行了


注:stoi是将string类型转换成int型

#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#include<vector>
using namespace std;
const int N=1010;
double g[N][N],maxn[N];
vector<int>a,b;
set<int>A,B;
int n,m;
int main()
{
    cin>>n>>m;
    while(m--)
    {
        int k;
        a.clear();
        b.clear();
        cin>>k;
        for(int i=0;i<k;i++)
        {
            string s;
            cin>>s;
            if(s[0]=='-')//女性
            {
                a.push_back(abs(stoi(s)));
                A.insert(abs(stoi(s)));
            }
            else//男性
            {
                b.push_back(stoi(s));
                B.insert(stoi(s));
            }
        }
        for(int i=0;i<a.size();i++)
        {
            for(int j=0;j<b.size();j++)
            {
                g[a[i]][b[j]]+=1.0/k;
                g[b[j]][a[i]]+=1.0/k;
                if(maxn[a[i]]<g[a[i]][b[j]]) maxn[a[i]]=g[a[i]][b[j]];
                if(maxn[b[j]]<g[b[j]][a[i]]) maxn[b[j]]=g[b[j]][a[i]];
            }
        }
    }
    string s1,s2;
    int aa,bb;
    cin>>s1>>s2;
    aa=abs(stoi(s1)),bb=abs(stoi(s2));
    if(maxn[aa]==g[aa][bb]&&maxn[bb]==g[bb][aa])//s1和s2正是彼此亲密度最高的
    {
        cout<<s1<<' '<<s2;
        return 0;
    }
    if(s1[0]=='-')//第一个人是女性
    {
        for(auto p:B)//遍历异性
            if(maxn[aa]==g[p][aa])
                cout<<s1<<' '<<p<<endl;
    }
    else
    {
        for(auto p:A)
            if(maxn[aa]==g[p][aa])
                cout<<s1<<' '<<'-'<<p<<endl;
    }
    if(s2[0]=='-')
    {
        for(auto p:B)
            if(maxn[bb]==g[bb][p])
                cout<<s2<<' '<<p<<endl;
    }
    else
    {
        for(auto p:A)
            if(maxn[bb]==g[bb][p])
                cout<<s2<<' '<<'-'<<p<<endl;
    }
    return 0;
}


目录
相关文章
|
2月前
|
算法
【错题集-编程题】城市群数量
【错题集-编程题】城市群数量
L2-028 秀恩爱分得快 (25 分)
L2-028 秀恩爱分得快 (25 分)
135 0
【每日一道智力题】之海盗分金币(上)
【每日一道智力题】之海盗分金币(上)
133 0
(模拟)(笔记)1241. 外卖店优先级
(模拟)(笔记)1241. 外卖店优先级
56 0
|
测试技术
PAT乙级1005.继续(3n+1)猜想(25分)
PAT乙级1005.继续(3n+1)猜想(25分)
66 0
|
机器学习/深度学习 测试技术
PAT乙级1001 害死人不偿命的(3n+1)猜想 (15分)
PAT乙级1001 害死人不偿命的(3n+1)猜想 (15分)
70 0
L2-029 特立独行的幸福 (25 分)(数组模拟)
L2-029 特立独行的幸福 (25 分)(数组模拟)
108 0
|
算法 测试技术
h0103. 末日算法 (10 分)
h0103. 末日算法 (10 分)
208 0
L2-040 哲哲打游戏 (25 分)(模拟)
L2-040 哲哲打游戏 (25 分)(模拟)
111 0
L1-024 后天 (5 分)
L1-024 后天 (5 分)
135 0