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;
}

博客参考: https://www.cnblogs.com/8023spz/p/9534865.html

posted @ 2024-03-19 18:20  YuKiCheng  阅读(27)  评论(0编辑  收藏  举报