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