PTA | 秀恩爱分得快

目录

题目:

输入格式:

输出格式:

输入样例 1:

输出样例 1:

输入样例 2:

输出样例 2:

代码:

无注释版:

有注释版: 


题目:

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

互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 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:

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

代码长度限制16 KB,时间限制500 ms,内存限制64 MB,栈限制8192 KB

代码:

无注释版:
#include
using namespace std;
bool sex[1010];
double q[1010][1010];
void print(int a,int b){
    if(!sex[a]) cout<<"-";
    cout<>n>>m;
    while(m--){
        int k;
        cin>>k;
        double m=1.0/k;
        vector s;
        while(k--){
            string x;
            cin>>x;
            int num=0;
            for(int i=0;i='0'&&x[i]<='9'){
            		num=num*10+int(x[i]-'0');
				}
			}
            if(x[0]!='-'){
                sex[num]=1;
            }
            for(int i=0;i>a>>b;
    a=abs(a);
    b=abs(b);
    double max1=0,max2=0;
    for(int i=0;i
有注释版: 
#include
using namespace std;

// sex 数组用于表示每个成员的性别,true 表示男性,false 表示女性
bool sex[1010]; 

// q 数组用于存储每对成员之间的亲密度
double q[1010][1010]; 

// 输出函数,用于输出一对成员及其亲密度最高的异性朋友
void print(int a, int b) {
    // 如果 a 是女性,输出负号
    if (!sex[a]) cout << "-";
    cout << a << " ";  // 输出 a 的编号
    
    // 如果 b 是女性,输出负号
    if (!sex[b]) cout << "-";
    cout << b << "\n";  // 输出 b 的编号
}

int main() {
    ios::sync_with_stdio(0);  // 禁用同步输入输出,提高效率
    cin.tie(0);  // 解除 cin 和 cout 的绑定
    cout.tie(0);  // 解除 cin 和 cout 的绑定

    int n, m;
    cin >> n >> m;  // 输入总人数 n 和照片总数 m
    
    // 处理每一张照片
    while (m--) {
        int k;
        cin >> k;  // 输入照片中人物的数量
        
        double m = 1.0 / k;  // 计算每个人与其他人亲密度的值(1/K)
        
        vector s;  // 用于存储该照片中出现的所有人的编号
        
        // 处理每个出现的人
        while (k--) {
            string x;
            cin >> x;  // 输入某个人的编号(可能带有负号表示女性)
            
            int num = 0;
            // 解析编号中的数字
            for (int i = 0; i < x.size(); i++) {
                if (x[i] >= '0' && x[i] <= '9') {
                    num = num * 10 + int(x[i] - '0');  // 计算数字编号
                }
            }
            
            // 如果编号没有负号,说明是男性,标记为 true
            if (x[0] != '-') {
                sex[num] = 1;  // 男性
            }
            
            // 对每个新加入的人,计算与已经出现过的人的亲密度
            for (int i = 0; i < s.size(); i++) {
                if (sex[num] != sex[s[i]]) {  // 只有异性才有亲密度
                    q[num][s[i]] += m;  // 更新 num 和 s[i] 之间的亲密度
                    q[s[i]][num] += m;  // 由于是无向关系,亲密度是对称的
                }
            }
            
            s.push_back(num);  // 将当前编号添加到 s 数组中,表示该人已出现
        }
    }
    
    // 输入情侣的编号 A 和 B
    int a, b;
    cin >> a >> b;
    
    // 转换 A 和 B 为绝对值,因为编号前的负号表示性别
    a = abs(a);
    b = abs(b);
    
    double max1 = 0, max2 = 0;
    
    // 寻找 A 最亲密的异性朋友
    for (int i = 0; i < n; i++) {
        if (sex[a] != sex[i]) {  // 确保是异性
            max1 = max(max1, q[a][i]);  // 更新 A 最亲密的异性朋友的亲密度
        }
        if (sex[b] != sex[i]) {  // 确保是异性
            max2 = max(max2, q[b][i]);  // 更新 B 最亲密的异性朋友的亲密度
        }
    }

    // 如果 A 和 B 彼此是对方最亲密的异性朋友,直接输出
    if (q[a][b] == max1 && q[b][a] == max2) {
        print(a, b);
        return 0;
    }

    // 输出 A 最亲密的异性朋友
    for (int i = 0; i < n; i++) {
        if (q[a][i] == max1) {  // 如果 A 和 i 的亲密度是最大值
            print(a, i);  // 输出这对异性朋友
        }
    }

    // 输出 B 最亲密的异性朋友
    for (int i = 0; i < n; i++) {
        if (q[b][i] == max2) {  // 如果 B 和 i 的亲密度是最大值
            print(b, i);  // 输出这对异性朋友
        }
    }
}

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