L2-028 秀恩爱分得快
测试点会出现-0这种,直接导致无法使用int类型接收编号,因为无从判断性别,因此只能用string类型。
并且需要使用sex来记录当前是男性还是女性,只有对方是异性的时候,亲密度才有意义。
#include <bits/stdc++.h>
using namespace std;
int p[1010][510], k[1010], sex[1010];
double record[2][1010];//ab和其他人之间的亲密度
void print(int a,int b) {
if (sex[a] < 0) printf("-");
printf("%d ", a);
if (sex[b] < 0) printf("-");
printf("%d\n", b);
}
int getno(string str) {
int i = 0, g = 1;
if (str[0] == '-') {
g = -1;
i++;
}
int bianhao = stoi(str.substr(i));
sex[bianhao] = g;//如果前面是负号 就认为是女孩 反之认为是男孩
return bianhao;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {//将其存储起来
cin>>k[i];
for (int j = 0; j < k[i]; j++) {
string t;
cin >> t;
int tno = getno(t);
p[i][j] = tno;
}
}
string s1, s2;
cin >> s1 >> s2;
int a = getno(s1);
int b = getno(s2);
for (int i = 0; i < m; i++) {
for (int j = 0; j < k[i]; j++) {//遍历
double ks = (double)1/ k[i];
if (p[i][j] != a && p[i][j] != b) continue;
for (int l = 0; l < k[i]; l++) {//这一行当中有a和b
if (p[i][j] == a && sex[a] * sex[p[i][l]]<0) {//必须是异性
record[0][p[i][l]]+=ks;
}
if (p[i][j] == b && sex[b] * sex[p[i][l]] < 0) {
record[1][p[i][l]]+=ks;
}
}
}
}
//检查亲密度
double maxa = 0, maxb = 0;
int ant = 0, ant2 = 0;
int ans[1010], ans2[1010];
memset(ans, 0, sizeof(ans));
memset(ans2, 0, sizeof(ans2));
for (int i = 0; i < n; i++) {
if (record[0][i] > maxa) {
maxa = record[0][i];
ans[ant = 0] = i;
}
else if (record[0][i] == maxa) {
ans[++ant] = i;
}
if (record[1][i] > maxb) {
maxb = record[1][i];
ans2[ant2 = 0] = i;
}
else if (record[1][i] == maxb) {
ans2[++ant2] = i;
}
}
if (maxa == record[0][b] && maxa == maxb) {
print(a, b);
return 0;
}
for (int i = 0; i <= ant; i++) {
print(a, ans[i]);
}
for (int i = 0; i <= ant2; i++) {
print(b, ans2[i]);
}
return 0;
}