zoukankan      html  css  js  c++  java
  • 秀恩爱分得快

    L2-4 秀恩爱分得快 (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。但如果 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 <bits/stdc++.h>
    
    using namespace std;
    const int maxn=1e5+5;
    vector<int>G[maxn];
    vector<double>u(1005),v(1005);
    int k,cnt[maxn];
    string now;
    int a,b;
    double amaxn,bmaxn;
    stringstream st;
    bool q[maxn];
    int main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            cin>>k;
            G[i].resize(k);
            for(int j=0;j<k;j++){
                cin>>now;
                bool flag=true;
                int cur;
                if(now[0]=='-')flag=false,now=now.substr(1);
                st.clear();
                st.str("");
                st<<now;
                st>>cur;
                q[cur]=flag;
                G[i][j]=cur;
            }
        }
        st.clear();
        st.str("");
        cin>>now;
        if(now[0]=='-')now=now.substr(1);
        st<<now;
        st>>a;
        cin>>now;
        st.clear();
        st.str("");
        if(now[0]=='-')now=now.substr(1);
        st<<now;
        st>>b;
        for(int i=1;i<=m;i++){
            bool s=find(G[i].begin(),G[i].end(),a)!=G[i].end();
            bool t=find(G[i].begin(),G[i].end(),b)!=G[i].end();
            double cur=1.0/G[i].size();
            if(s||t){
                for(int j=0;j<G[i].size();j++){
                    if(s&&q[a]!=q[G[i][j]]){
                         u[G[i][j]]+=cur;
                         amaxn=max(amaxn,u[G[i][j]]);
                    }
                    if(t&&q[b]!=q[G[i][j]]){
                        v[G[i][j]]+=cur;
                        bmaxn=max(bmaxn,v[G[i][j]]);
                    }
                }
            }
        }
        if(amaxn==u[b]&&bmaxn==v[a]){
            printf("%s%d %s%d
    ",q[a]==false?"-":"",a,q[b]==false?"-":"",b);
        }
        else{
            for(int i=0;i<n;i++){
                 if(amaxn==u[i])printf("%s%d %s%d
    ",q[a]==false?"-":"",a,q[i]==false?"-":"",i);
            }
            for(int i=0;i<n;i++){
                 if(bmaxn==v[i])printf("%s%d %s%d
    ",q[b]==false?"-":"",b,q[i]==false?"-":"",i);
            }
        }
        return 0;
    }
     
  • 相关阅读:
    Java学习二十九天
    Java学习二十八天
    47. Permutations II 全排列可重复版本
    46. Permutations 全排列,无重复
    subset ii 子集 有重复元素
    339. Nested List Weight Sum 339.嵌套列表权重总和
    251. Flatten 2D Vector 平铺二维矩阵
    217. Contains Duplicate数组重复元素
    209. Minimum Size Subarray Sum 结果大于等于目标的最小长度数组
    438. Find All Anagrams in a String 查找字符串中的所有Anagrams
  • 原文地址:https://www.cnblogs.com/czy-power/p/10545965.html
Copyright © 2011-2022 走看看