L2-028 秀恩愛分得快 (25 point(s))

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

互聯網上每天都有大量人發佈大量照片,我們通過分析這些照片,可以分析人與人之間的親密度。如果一張照片上出現了 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

思路:

1.首先讀入數據的時候注意存在-0表示0號爲女生,但是int無法識別,因此讀入需要用字符串,然後轉換一下,輸出同理注意轉換。
2.讀入數據存下每張照片的人的編號
3.讀入情侶編號後開始遍歷照片,利用find函數(STL容器的查找函數,暴力查找,找到返回指向位置的迭代器,否則返回.end())看是否這張照片中有A,B,若有就進行記錄異性的親密度,並且記錄各自親密度最大值
4.輸出判斷,如果A記錄下的親密度最大值和B的親密度一樣並且B記錄下的親密度最大值和A的親密度一樣,在這種情況下,即使還有其他並列親密度的編號只輸出A B。其他情況就分別輸出和A的最大親密度一樣的編號以及和B的最大親密度的編號,因爲題目還要求按編號從小到大,方法可以是用桶放每個編號親密度,輸出的時候遍歷桶即可

code:



#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
bool gender[maxn] = {0};
vector<int> Photo[maxn];
double pa[maxn],pb[maxn];
int get(char s[]){
    int res;
    if(s[0] == '-'){
        res = atoi(s+1);
        gender[res] = 1;
    }
    else{
        res = atoi(s);
    }
    return res;
}
void print(int a,int b){
    if(gender[a]) putchar('-');
    printf("%d ",a);
    if(gender[b]) putchar('-');
    printf("%d",b);
    puts("");
}
int main(){
    int n,m,k,a,b;
    double pa_max = 0.0,pb_max = 0.0;
    scanf("%d%d",&n,&m);
    for(int i = 0; i < m; i++){
        scanf("%d",&k);
        for(int j = 0; j < k; j++){
            char s[10];
            scanf("%s",s);
            Photo[i].push_back(get(s));
        }
    }
    char s1[10],s2[10];
    scanf("%s%s",s1,s2);
    a = get(s1);
    b = get(s2);
    //讀入數據
    for(int i = 0; i < m; i++){
        bool founda = find(Photo[i].begin(),Photo[i].end(),a) != Photo[i].end();
        bool foundb = find(Photo[i].begin(),Photo[i].end(),b) != Photo[i].end();
        if(founda || foundb){
            for(int j = 0; j < Photo[i].size(); j++){
                int c = Photo[i][j];
                if(founda && gender[a] != gender[c]){
                    pa[c] += (double)1 / Photo[i].size();
                    pa_max = max(pa_max,pa[c]);
                }
                if(foundb && gender[b] != gender[c]){
                    pb[c] += (double)1 / Photo[i].size();
                    pb_max = max(pb_max,pb[c]);
                }
            }
        }
    }
    //統計
    if(pa_max == pa[b] && pb_max == pb[a])
        print(a,b);
    else{
        for(int i = 0; i < n; i++){
            if(pa[i] == pa_max)
                print(a,i);
        }
        for(int i = 0; i < n; i++){
            if(pb[i] == pb_max)
                print(b,i);
        }
    }
    //判斷輸出
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章