一看是个简单的模拟题,但是需要注意的是输入数据中给的-0这种情况,所以我们需要将数字读成字符串,然后就面临一个问题,到底是string写map还是String转int写hash,还是string转int好一些,用最基本的数据结构才是最简单的。
另外,在相片里需要确认,是否含有fa和fb两个人,最方便的写法就是用find函数,find(v.begin(),v.end(),1) != v.end() 就是找到了。
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
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 15;
const int M = 5e2 + 15;
int n,m,sex[N];
double maxa,maxb,pa[N],pb[N];
vector<int> p[N];
int Get(string x)
{
int t = 0,s = 1;
if(x[0] == '-') s = 0;
for(int i = !s; i < x.size(); i ++)
t = t * 10 + x[i] - '0';
sex[t] = s;
return t;
}
void print(int a,int b)
{
printf("%s%d %s%d\n",sex[a]?"":"-",a,sex[b]?"":"-",b);
}
int main()
{
int k;
string x;
cin >> n >> m;
for(int i = 0; i < m; i ++)
{
cin >> k;
for(int j = 0; j < k; j ++)
{
cin >> x;
p[i].push_back(Get(x));
}
}
string a,b;
cin >> a >> b;
int fa = Get(a),fb = Get(b);
bool exa,exb;
for(int i = 0; i < m; i ++)
{
exa = find(p[i].begin(),p[i].end(),fa) != p[i].end();
exb = find(p[i].begin(),p[i].end(),fb) != p[i].end();
if(exa || exb)
{
if(exa)
{
for(int j = 0; j < p[i].size(); j ++)
if(sex[p[i][j]] != sex[fa])
{
pa[p[i][j]] += 1.0 / p[i].size();
maxa = max(maxa,pa[p[i][j]]);
}
}
if(exb)
{
for(int j = 0; j < p[i].size(); j ++)
if(sex[p[i][j]] != sex[fb])
{
pb[p[i][j]] += 1.0 / p[i].size();
maxb = max(maxb,pb[p[i][j]]);
}
}
}
}
if(pa[fb] == maxa && maxb == pb[fa]) print(fa,fb);
else
{
for(int i = 0; i < n; i ++)
if(pa[i] == maxa)
print(fa,i);
for(int i = 0; i < n; i ++)
if(pb[i] == maxb)
print(fb,i);
}
return 0;
}