L2-028 秀恩爱分得快

输入样例 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

代码长度限制

16 KB

时间限制

500 ms

内存限制

64 MB

栈限制

8192 KB

这题坑点就在于可能有“女光头”, 就是-0, 所以要加上这个,再有超时就是你数组开太大了

#include "bits/stdc++.h"
using namespace std;
vector<int> f, m; //存不同sex的人 
int vis[1002] = {0}; //看当前这个人有没有被存到sex里面 
double re[1002][1002] = {0}; //i和j之间的亲密度 
int y[1002]; //临时存储一张照片里面的所有人,用于计算亲密度 
vector<int> v1, v2; //计算要求的一对情侣的亲密度最高的异性 
int p1 = 0, p2 = 0, f1 = 0, f2 = 0; //用来存一对情侣的编号,以及是男是女 
string s1, s2;//用来判断性别的,防止有女性大光头,也就是-0 
int ff(string s,int t){ //字符串转数字 
	int tmp = 0;
	for(int i = t; i < s.length(); i ++){
		tmp = tmp * 10 + (s[i] - '0');
	}
	return tmp;
}

void aa(int x, vector<int> &sex, vector<int> &v){ //看是男性还是女性,然后将和他/她关系最好的异性列出来 
	double ans = -1;
	int xx;
	if(x == 1) xx = p1;
	else xx = p2;
	for(int i = 0; i < sex.size(); i ++){
		if(re[xx][sex[i]] > ans){
			ans = re[xx][sex[i]];
			v.clear();
			v.push_back(sex[i]);
		}
		else if(re[xx][sex[i]] == ans){
			v.push_back(sex[i]);
		}
	}
}
int main(){
	int n, mm;
	cin>>n>>mm;
	while(mm--){
		int k;
		cin>>k;
		int x;
		double score = 1.0 / (double)k * 1.0; //求一张照片里的人的亲密度 
		string ss;
		for(int i = 0; i < k; i ++){
			cin>>ss;
			int flag = 1;
			if(ss[0] == '-')  flag = 0, y[i] = ff(ss, 1);
			else  y[i] = ff(ss, 0); 
			
			int x = y[i];
			if(!flag){
				if(!vis[x]) f.push_back(x), vis[x] = 1;
			}
			else if(!vis[x]) m.push_back(x), vis[x] = 1;
		}
		for(int i = 0; i < k; i++)
			for(int j = 0; j < k; j ++)
				if(i != j) re[y[i]][y[j]] += score;	//两两相加				
	}	

	cin>>s1>>s2;  
	if(s1[0] == '-') {
		f1 = 1, p1 = ff(s1, 1), p2 = ff(s2, 0);
	}
	if(s2[0] == '-') {
		f2 = 1, p2 = ff(s2, 1), p1 = ff(s1, 0);        
	}

	if(f1 > 0 ) aa(1, m, v1);
	else aa(1, f, v1);
	if(f2 > 0 ) aa(2, m, v2);
	else aa(2, f, v2);
	
	int flag = 0;
	//查看对方是是否是亲密度最高的人 
	for(int i = 0; i < v1.size(); i ++)
		if(v1[i] == p2) {
			flag ++;
			break;
		}
	
	for(int i = 0; i < v2.size(); i ++)
		if(v2[i] == p1) {
			flag ++;
			break;
		}
	
	if(flag == 2) {
		if(f1) cout<<'-'<<p1<<" "<<p2;
		if(f2) cout<<p1<<" -"<<p2;
	}
	else {
		sort(v1.begin(), v1.end());
		sort(v2.begin(), v2.end());
		for(int i = 0; i < v1.size(); i ++){
			if(f1) cout<<"-"<<p1<<" "<<v1[i]<<endl;
			else cout<<p1<<" -"<<v1[i]<<endl;
		}
		for(int i = 0; i < v2.size(); i ++){
			if(f2) cout<<"-"<<p2<<" "<<v2[i];
			else cout<<p2<<" -"<<v2[i];
			if(i != v2.size() - 1 ) cout<<endl;
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小竹子14

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值