秀恩爱分得快

通过分析互联网上人们发布的照片,计算照片中人物之间的亲密度,特别关注一对给定情侣与其他异性朋友之间的亲密度比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 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。但如果 A 和 B 正是彼此亲密度最高的一对,则只输出他们的编号,无论是否还有其他人并列。
输入样例 1:
10 4
4 -1 2 -3 4
4 2 -3 -5 -6
3 2 4 -5
3 -6 0 2
-3 2
输出样例 1:
-3 2
2 -5
2 -6
输入样例 2:
4 4
4 -1 2 -3 0
2 0 -3
2 2 -3
2 -1 2
-3 2
输出样例 2:
-3 2

#include<stdio.h>
#include<map>
#include<set>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
int x,y;
double num[1010],num1[1010];
int Map[1010][1010];
int visited[1010][1010];
int row[1010];
map<int,int> Map1;
set<int> Set[1010];
int main()
{
    int i,j,n,m,k,t;
    char s[10];
    scanf("%d %d",&n,&m);
    for(i=0;i<m;i++)
    {
        scanf("%d",&row[i]);
        for(j=0;j<row[i];j++)
        {
            scanf("%s",s);
            if(s[0]=='-')
            {
                Map[i][j]=-(atoi(s));
                Map1[Map[i][j]]=-1;
            }
            else
            {
                Map[i][j]=atoi(s);
                Map1[Map[i][j]]=1;
            }
            Set[i].insert(Map[i][j]);
        }
    }
    scanf("%s",s);
    if(s[0]=='-')
    {
        x=-(atoi(s));
        Map1[x]=-1;
    }
    else
    {
        x=atoi(s);
        Map1[x]=1;
    }
    scanf("%s",s);
    if(s[0]=='-')
    {
        y=-(atoi(s));
        Map1[y]=-1;
    }
    else
    {
        y=atoi(s);
        Map1[y]=1;
    }
    double Max=0;
    for(i=0;i<m;i++)
    {
        if(Set[i].find(x)!=Set[i].end())
        {
            for(j=0;j<row[i];j++)
            {
                if(Map[i][j]!=x&&Map1[x]!=Map1[Map[i][j]])
                {
                    num[Map[i][j]]+=(1.0/row[i]);
                    if(num[Map[i][j]]>Max)
                    {
                        Max=num[Map[i][j]];
                    }
                }
            }
        }
    }
    double Max1=0;
    for(i=0;i<m;i++)
    {
        if(Set[i].find(y)!=Set[i].end())
        {
            for(j=0;j<row[i];j++)
            {
                if(Map[i][j]!=y&&Map1[y]!=Map1[Map[i][j]])
                {
                    num1[Map[i][j]]+=(1.0/row[i]);
                    if(num1[Map[i][j]]>Max1)
                    {
                        Max1=num1[Map[i][j]];
                    }
                }
            }
        }
    }
    if(fabs(Max-num[y])<1e-6&&fabs(Max1-num1[x])<1e-6)
    {
        if(Map1[x]==-1)
        {
            printf("-%d",x);
        }
        else
        {
            printf("%d",x);
        }
        printf(" ");
        if(Map1[y]==-1)
        {
            printf("-%d",y);
        }
        else
        {
            printf("%d",y);
        }
        printf("\n");
    }
    else
    {
        for(i=0;i<n;i++)
        {
            if(fabs(num[i]-Max)<1e-6&&Map1[x]!=Map1[i])
            {
                visited[x][i]=visited[i][x]=1;
                if(Map1[x]==-1)
                {
                    printf("-%d",x);
                }
                else
                {
                    printf("%d",x);
                }
                printf(" ");
                if(Map1[i]==-1)
                {
                    printf("-%d",i);
                }
                else
                {
                    printf("%d",i);
                }
                printf("\n");
            }
        }
        for(i=0;i<n;i++)
            {
                if(fabs(num1[i]-Max1)<1e-6&&visited[y][i]==0&&Map1[y]!=Map1[i])
                {
                    if(Map1[y]==-1)
                    {
                        printf("-%d",y);
                    }
                    else
                    {
                        printf("%d",y);
                    }
                    printf(" ");
                    if(Map1[i]==-1)
                    {
                        printf("-%d",i);
                    }
                    else
                    {
                        printf("%d",i);
                    }
                    printf("\n");
                }
            }
    }
    return 0;
}
<think>嗯,用户问的是关于PTA测试题“秀恩爱分得”的相关考点。首先,我需要回忆一下这个题目的内容。可能涉及到数据结构中的图论或者树结构,因为这类题目通常需要处理关系网络。根据引用[1]提到的考点成绩汇总,可能涉及数据结构的操作,比如并查集或者排序算法。 题目名称“秀恩爱分得”听起来像是处理情侣关系,可能涉及到配对问题。PTA的题目通常要求高效的数据结构应用,比如邻接表存储关系,然后进行遍历或者查找。例如,找出最亲密的情侣对,或者判断两人是否是彼此的最爱。 另外,用户提到的测试点可能包括边界情况,比如最大数据量测试,或者输入中存在多个相同亲密值的情况。这时候需要注意算法的时间复杂度,避免超时。比如使用哈希表来速查找亲密值,或者优先队列来维护最高亲密度。 还有可能考察图的遍历,比如DFS或BFS,来寻找特定关系路径。或者涉及到动态规划,计算情侣之间的亲密度累积。需要确保代码正确处理输入格式,比如亲密度值的读取和存储结构。 可能还需要考虑输出格式,比如按照要求输出情侣对,或者判断是否为彼此的最爱。测试点可能包括正确性、效率和特殊情况处理,例如没有亲密关系的情况,或者多个并列最高的情况。 总之,这个题目可能的考点包括数据结构的选择与实现(如哈希表、邻接表)、算法优化(如速查找最大值)、边界条件处理,以及对题意的准确理解。需要结合引用[1]中提到的考点局域网成绩汇总,可能涉及数据的高效合并与处理,比如并查集结构来处理不同考点的数据汇总。</think>关于PTA测试题“秀恩爱分得”,根据系统内数据结构相关考点的描述[^1],该题主要考察以下核心能力: ### 一、题目特征 1. **数据关系建模** 需要将社交网络中的"亲密值"抽象为带权图结构,使用邻接表或邻接矩阵存储关系数据$G=(V,E)$ 2. **最值筛选算法** 要求速找出每个用户的最高亲密值对象,时间复杂度需控制在$O(n)$或$O(n \log n)$ ### 二、关键测试点 1. **边界条件处理** - 用户数量达到$10^5$量级的性能测试 - 亲密值相等时的输出顺序 - 互为最高亲密值的判断逻辑 2. **数据结构应用** ```python # 典型数据结构示例(邻接表+哈希表) intimacy_dict = defaultdict(dict) for u, v, score in relations: intimacy_dict[u][v] = score intimacy_dict[v][u] = score ``` 3. **算法优化难点** 需要预处理每个用户的亲密值排序,使用堆结构维护Top K关系: $$T(n) = O(n \log k) \quad \text{空间复杂度} \quad O(n)$$ ### 三、易错点分析 1. **双向关系判定** 必须验证$A \rightarrow B$和$B \rightarrow A$是否同时满足最高亲密值条件 2. **输入输出效率** 大规模数据需采用速IO方法,例如Python中使用`sys.stdin.readline`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【执珪】瑕瑜·夕环玦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值