problem
L2-028 秀恩爱分得快 (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
给出n个人,求一对cp最亲密的异性是谁给出m张照片,每张上的k个人两两亲密度+=1/k
solution
枚举照片,如果出现了cp,累加他们和其他异性的亲密度,排序输出。对于0和-0,把他们转换为1000以上(大于范围就行)BUG了一次,只有15分,改不动了,重新写一遍
#include<bits/stdc++.h>
using namespace std
;
bool cmp(int a
, int b
){
if(abs(a
)==1000)return true;
if(abs(b
)==1000)return false;
return abs(a
)<abs(b
);
}
int main(){
int n
, m
, sex
[1010]={0};
cin
>>n
>>m
;
vector
<vector
<int>>photo(m
);
for(int i
= 0; i
< m
; i
++){
int k
; cin
>>k
;
for(int j
= 0; j
< k
; j
++){
string s
; cin
>>s
;
if(s
=="0")s
="1000";
if(s
=="-0")s
="-1000";
int tmp
= stoi(s
);
photo
[i
].push_back(tmp
);
sex
[abs(tmp
)] = tmp
;
}
}
int cp
[3];
for(int i
= 1; i
<= 2; i
++){
string s
; cin
>>s
;
if(s
=="0")s
="1000";
if(s
=="-0")s
="-1000";
cp
[i
] = stoi(s
);
}
double love
[1010] = {0};
for(int c
= 1; c
<= 2; c
++){
for(int i
= 0; i
< m
; i
++){
int ok
= 0;
for(int j
= 0; j
< photo
[i
].size(); j
++){
if(photo
[i
][j
]==cp
[c
]){
ok
= 1;
break;
}
}
if(ok
){
for(int j
= 0; j
< photo
[i
].size(); j
++){
if(cp
[c
]*photo
[i
][j
]<0){
love
[abs(photo
[i
][j
])] += 1.0/photo
[i
].size();
}
}
}
}
}
double maxx
[3] = {0};
vector
<vector
<int> >ans(3);
for(int c
= 1; c
<= 2; c
++){
for(int i
= 1; i
<= 1000; i
++){
if(cp
[c
]*sex
[i
]<0){
if(love
[i
]>maxx
[c
]){
maxx
[c
] = love
[i
];
ans
[c
].clear();
ans
[c
].push_back(sex
[i
]);
}else if(love
[i
]==maxx
[c
]){
ans
[c
].push_back(sex
[i
]);
}
}
}
}
if(maxx
[1]==love
[abs(cp
[2])] && maxx
[2]==love
[abs(cp
[1])]){
string s1
= to_string(cp
[1]), s2
= to_string(cp
[2]);
if(cp
[1]==1000)s1
="0";
if(cp
[1]==-1000)s1
="-0";
if(cp
[2]==1000)s2
="0";
if(cp
[2]==-1000)s2
="-0";
cout
<<s1
<<" "<<s2
<<endl
;
return 0;
}
for(int c
= 1; c
<= 2; c
++){
sort(ans
[c
].begin(), ans
[c
].end(),cmp
);
for(int i
= 0; i
< ans
[c
].size(); i
++){
string s1
= to_string(cp
[c
]), s2
= to_string(ans
[c
][i
]);
if(cp
[c
]==1000)s1
= "0";
if(cp
[c
]==-1000)s1
= "-0";
if(ans
[c
][i
]==1000)s2
= "0";
if(ans
[c
][i
]==-1000)s2
= "-0";
cout
<<s1
<<" "<<s2
<<endl
;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std
;
bool cmp(pair
<int,double>a
, pair
<int,double> b
){
if(a
.second
!=b
.second
)return a
.second
>b
.second
;
return a
.first
<b
.first
;
}
int main(){
int n
, m
;
cin
>>n
>>m
;
vector
<vector
<int> >photo(m
+1);
for(int i
= 1; i
<= m
; i
++){
int k
; cin
>>k
;
for(int j
= 1; j
<= k
; j
++){
string x
; cin
>>x
;
if(x
=="0")x
= "1000";
if(x
=="-0")x
= "-1000";
photo
[i
].push_back(stoi(x
));
}
}
int cp
[3];
for(int i
= 1; i
<= 2; i
++){
string x
; cin
>>x
;
if(x
=="0")x
= "1000";
if(x
=="-0")x
= "-1000";
cp
[i
] = stoi(x
);
}
double love
[3][1050];
memset(love
,0,sizeof(love
));
for(int i
= 1; i
<= m
; i
++){
for(int c
= 1; c
<= 2; c
++){
int ok
= 0;
for(int j
= 0; j
< photo
[i
].size(); j
++){
if(photo
[i
][j
]==cp
[c
]){
ok
= 1; break;
}
}
if(ok
){
for(int j
= 0; j
< photo
[i
].size(); j
++){
if(cp
[c
]*photo
[i
][j
]<0){
love
[c
][abs(photo
[i
][j
])] += 1.0/photo
[i
].size();
}
}
}
}
}
vector
<pair
<int,double> >ans
[3];
for(int i
= 1; i
<= 1000; i
++){
for(int c
= 1; c
<= 2; c
++){
if(love
[c
][i
]>0){
ans
[c
].push_back(make_pair(i
,love
[c
][i
]));
}
}
}
sort(ans
[1].begin(),ans
[1].end(),cmp
);
sort(ans
[2].begin(),ans
[2].end(),cmp
);
if(abs(ans
[1][0].second
-love
[1][abs(cp
[2])])<0.02 && abs(ans
[2][0].second
-love
[2][abs(cp
[1])])<0.02){
string s1
= to_string(cp
[1]), s2
= to_string(cp
[2]);
if(cp
[1]==1000)s1
="0";
if(cp
[1]==-1000)s1
="-0";
if(cp
[2]==1000)s2
="0";
if(cp
[2]==-1000)s2
="-0";
cout
<<s1
<<" "<<s2
<<endl
;
return 0;
}
for(int c
= 1; c
<= 2; c
++){
for(int i
= 0; i
< ans
[c
].size(); i
++){
if(ans
[c
][i
].second
==ans
[c
][0].second
){
int t
= cp
[c
], tt
= -abs(cp
[c
]*ans
[c
][i
].first
)/cp
[c
];
string ts
= to_string(t
), tts
= to_string(tt
);
if(t
==1000)ts
="0";
if(t
==-1000)ts
="-0";
if(tt
==1000)tts
="0";
if(tt
==-1000)tts
="-0";
cout
<<ts
<<" "<<tts
<<endl
;
}
}
}
return 0;
}