【天梯赛】 L2-028 秀恩爱分得快 (25 point(s))***(STL|排序)

穿越隧道

在这里插入图片描述

大佬版

参考了大佬的思路,又是被自己菜到的一天
思路太妙了,大佬们的STL基础也超好。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n,m;
bool gender[N];//prevent timeout and out of space;
int read(){
	int input = 0, flag = 0;
	char a = getchar();
	while((a < '0' || a > '9') && a != '-'){//将换行、回车符去掉 
		a =getchar();
	}
	if(a == '-'){//说明读入的为女生 
		flag = 1;
		a = getchar();
	}
	while(a >= '0' && a <= '9'){//input为编号 
		input = input * 10 + (a - '0');
		a = getchar();
	}
	gender[input] = flag;//编号为input的人的性别。
	return input; 
}
double pa_mx, pb_mx;
int main(){
	scanf("%d%d",&n,&m);
	vector<vector<int>> p(n);//
	vector<double> pa(n,0);
	vector<double> pb(n,0);//桶排序,pa[id] = id和a的亲密度
	for(int i = 0; i < m; i++){
		int cnt;
//		cin >> cnt;
		scanf("%d",&cnt);
		p[i].resize(int(cnt));//如果没有这一行,devc++就无法正确运行,官网会出现段错误。 
//		getchar();
//		cout << cnt << endl;
		for(int j = 0; j < cnt; j++){
			p[i][j] = read();
//			cout << p[i][j] << " "; 
		}
	}
	int a = read(), b = read();//将A,B这对情侣读入。
	for(int i = 0; i < m; i++){
		bool founda = find(p[i].begin(), p[i].end(),a) != p[i].end();//如果这张照片中存在A
		bool foundb = find(p[i].begin(), p[i].end(),b) != p[i].end();//同上 
		if(founda || foundb){
			for(int j = 0; j < p[i].size(); j++){
				if(founda && gender[a] != gender[p[i][j]]){//如果这张照片有A,而且A的性别和第i张j个人的性别不同 
					pa[p[i][j]] += 1.0/p[i].size();
					pa_mx = max(pa_mx,pa[p[i][j]]);//找到A和第i张照片j个人的最大亲密度 
				}
				else if(foundb && gender[b] != gender[p[i][j]]){
					pb[p[i][j]] += 1.0/p[i].size();
					pb_mx = max(pb_mx, pb[p[i][j]]);
				} 
			}
		} 
	} 
	if(pa_mx == pa[b] && pb_mx == pb[a]){//如果A和B的亲密度都是彼此的最大值,则直接输出。 
		printf("%s%d %s%d\n",gender[a] ?"-":"",a,gender[b] ?"-":"",b);
//		cout << () << a <<" " << gender[b] ?"-":"" << b << endl; //cout使用三目运算符报错 
	} 
	else{
		for(int i = 0; i < n; i++){//编号从0开始 
			if(pa[i] == pa_mx){
				printf("%s%d %s%d\n",gender[a] ?"-":"",a,gender[i] ?"-":"",i);
//				cout << gender[a] ?"-":"" << a <<" " << gender[i] ?"-":"" << i << endl;
			}
		}
		for(int i = 0; i < n; i++){
			if(pb[i] == pb_mx){
				printf("%s%d %s%d\n",gender[b] ?"-":"",b,gender[i] ?"-":"",i);
//				cout << gender[b] ?"-":"" << b <<" " << gender[i]?"-":"" << i << endl;
			}
		}
	}
	
	
	
	return 0; 
}

2分(野生版)

猜测这两分为第二个测试样例。
逻辑冗余,不清晰。
并且存在,-0的情况,编号为0的女生,int型不支持,掉进坑里了。

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;

const int N = 1e5 + 10;
int a[N];
typedef pair<int,int> pii;
map<pii,double> mp;
double ans;
int n,m;
int ansa[N],ansb[N];
int boy,girl;
struct node{
	pii aa;
	double val;
}cc[N];
bool cmp(node aaaa, node bbbb){
	return aaaa.val > bbbb.val;
}
int main(){
	cin >> n >> m;
	for(int i = 0; i < m; i++){
		int k;
		cin >> k;
		for(int j = 0; j < k; j++){
			cin >> a[j];
		}
		sort(a,a + k);
		int mid = lower_bound(a,a + k,0) - a;
//		cout << "mid = " << mid << endl;
		for(int j = 0; j < mid; j++){
			for(int uu = mid; uu < k; uu++){
				mp[{a[j],a[uu]}] += 1.0/k;
			}
		}
	}
	cin >> boy >> girl;
	map<pii,double>::iterator it;
	int kk = 0;
	for(it = mp.begin(); it != mp.end(); it++){
		pii g = it->first;
		if(g.x == boy || g.x == girl || g.y == boy || g.y == girl){
			cc[kk].aa = it->first;
			cc[kk++].val = it->second;
		}
	} 
	sort(cc,cc + kk,cmp);
	double mxa = 0, flaga = 0, mxb = 0, flagb = 0;
	double mx = cc[0].val;
	int kkk = 0;
	while(mx == cc[kkk].val){
//		cout <<"sdfs " << endl;
		if((cc[kkk].aa.x == girl && cc[kkk].aa.y == boy) || (cc[kkk].aa.x == boy && cc[kkk].aa.y == girl)){
			cout << boy << " " << girl;
			return 0;
		} 
		kkk++;
	}
	
	int numa = 0, numb = 0;
	for(int i = 0; i < kk; i++){
		if(((cc[i].aa.y == boy || cc[i].aa.x == boy) &&( !flaga || cc[i].val == mxa))){
			if(boy < 0){
				if(cc[i].aa.y == boy)
					ansa[numa++] = cc[i].aa.x;
				else if(cc[i].aa.x == boy){
					ansa[numa++] = cc[i].aa.y;
				}
			}
			else{
				if(cc[i].aa.y == boy)
					ansa[numa++] = -1*cc[i].aa.x;
				else if(cc[i].aa.x == boy){
					ansa[numa++] = -1*cc[i].aa.y;
				}
			}
			mxa == cc[i].val;
			flaga = 1;
		}
		cout << cc[i].aa.x <<" " << cc[i].aa.y << " "<< cc[i].val << endl;
	}
	sort(ansa, ansa + numa);
	if(boy >= 0){
		for(int i = 0; i < numa; i++){
			cout <<boy <<" -" << ansa[i] << endl;
		}
	}
	else{
		for(int i = 0; i < numa; i++){
			cout <<boy <<" " << ansa[i] << endl;
		}
	}
	for(int i = 0; i < kk; i++){
		if(((cc[i].aa.y == girl || cc[i].aa.x == girl) && (!flagb || (cc[i].val - mxb <= 1e-8)))){
			if(girl < 0){
				if(cc[i].aa.y == girl)
					ansb[numb++] = cc[i].aa.x;
				else if(cc[i].aa.x == girl){
					ansb[numb++] = cc[i].aa.y;
				}
			}
			else{
				if(cc[i].aa.y == girl)
					ansb[numb++] = -1*cc[i].aa.x;
				else if(cc[i].aa.x == girl){
					ansb[numb++] = -1*cc[i].aa.y;
				}
			}
//			cout <<"sdfsdf" << endl;
//			if(!flagb){
				mxb == cc[i].val;
//			}
			flagb = 1;
		}
//		cout << cc[i].aa.x <<" " << cc[i].aa.y << " "<< cc[i].val << endl;
	}
	sort(ansb,ansb + numb);
	if(girl >= 0){
		for(int i = 0; i < numb; i++){
			cout <<girl <<" -" << ansb[i] << endl;
		}
	}
	else{
		for(int i = 0; i < numb; i++){
			cout <<girl <<" " << ansb[i] << endl;
		}
	}
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值