PTAL2-028秀恩爱分得快
- 题目链接:PTAL2-029秀恩爱分得快
- 注意事项:
- 无算法,纯编程,主要就是性别的处理,亲近度的计算。
- 记住对照片的输入是要字符串,因为0可能是异性。
- 二者亲近度都与最大值相等,就输出这对情侣,如果不是相等的,哪怕其中一个人与其他异性的亲近度都是0也要输出(也就是未出现在照片中),测试3就是考这个。
- 测试点(参考)
10 3
3 1 2 -0
2 3 -4
2 -5 6
7 -8
#include <iostream>
#include <vector>
using namespace std;
int gender[1010];
float closeToOne[1010];
float closeToTwo[1010];
int N, M, K;
vector<int> List[1010];
int x1, x2;
void fun1()
{
string person;
int length;
int personNum;
int picNum = 1;
int rows = M;
while (rows--)
{
cin >> K;
while (K--)
{
personNum = 0;
cin >> person;
if (person[0] == '-')
{
person.erase(0, 1);
for (auto i : person)
{
personNum = personNum * 10 + int(i) - 48;
}
gender[personNum] = -1;
}
else
{
for (auto i : person)
{
personNum = personNum * 10 + int(i) - 48;
}
gender[personNum] = 1;
}
List[picNum].push_back(personNum);
}
picNum++;
}
}
void fun2(int &x1, int &x2)
{
string a, b;
cin >> a >> b;
int personNum = 0;
if (a[0] == '-')
{
a.erase(0, 1);
for (auto i : a)
{
personNum = personNum * 10 + int(i) - 48;
}
gender[personNum] = -1;
}
else
{
for (auto i : a)
{
personNum = personNum * 10 + int(i) - 48;
}
gender[personNum] = 1;
}
x1 = personNum;
personNum = 0;
if (b[0] == '-')
{
b.erase(0, 1);
for (auto i : b)
{
personNum = personNum * 10 + int(i) - 48;
}
gender[personNum] = -1;
}
else
{
for (auto i : b)
{
personNum = personNum * 10 + int(i) - 48;
}
gender[personNum] = 1;
}
x2 = personNum;
}
void fun3()
{
int flag1 = 0, flag2 = 0;
for (int i = 1; i <= M; i++)
{
flag1 = 0;
flag2 = 0;
for (auto k : List[i])
{
if (k == x1)
{
flag1 = 1;
}
else if (k == x2)
{
flag2 = 1;
}
}
if (flag1 && flag2)
{
for (auto k : List[i])
{
if (gender[k] != gender[x1])
{
closeToOne[k] += 1.0 / List[i].size();
}
else
{
closeToTwo[k] += 1.0 / List[i].size();
}
}
}
else if (flag1 == 1)
{
for (auto k : List[i])
{
if (gender[k] != gender[x1])
{
closeToOne[k] += 1.0 / List[i].size();
}
}
}
else if (flag2 == 1)
{
for (auto k : List[i])
{
if (gender[k] != gender[x2])
{
closeToTwo[k] += 1.0 / List[i].size();
}
}
}
}
}
void fun4()
{
void fun5(int a, int b);
float maxToOne = 0;
float maxToTwo = 0;
for (int i = 0; i < N; i++)
{
if (gender[i] != gender[x1])
{
maxToOne = max(maxToOne, closeToOne[i]);
}
if (gender[i] != gender[x2])
{
maxToTwo = max(maxToTwo, closeToTwo[i]);
}
}
if (maxToOne == closeToOne[x2] && maxToTwo == closeToTwo[x1])
{
fun5(x1, x2);
}
else
{
for (int i = 0; i < N; i++)
{
if (gender[i] != gender[x1] && closeToOne[i] == maxToOne)
{
fun5(x1, i);
}
}
for (int i = 0; i < N; i++)
{
if (gender[i] != gender[x2] && closeToTwo[i] == maxToTwo)
{
fun5(x2, i);
}
}
}
}
void fun5(int a, int b)
{
if (gender[a] == -1)
{
cout << "-" << a << " ";
}
else
{
cout << a << " ";
}
if (gender[b] == -1)
{
cout << "-" << b << endl;
}
else
{
cout << b << endl;
}
}
int main()
{
cin >> N >> M;
fun1();
fun2(x1, x2);
fun3();
fun4();
return 0;
}