L2-028 秀恩爱分得快(异或+暴力)

  • 题目链接:L2-028 秀恩爱分得快
  • 考查知识:异或+暴力
  • 题意描述:
    • 总共有n个人(男性正编号,女性负编号),他们形成了m个可相交的集合,每个集合人数为k,同属一个集合的人彼此间有1/k的好感度;
    • 问任意给定的一对情侣,分别有没有亲密度更高的异性朋友
  • 思路简析:
    • 首先是编号的正负问题,需要注意0有±,我们可以把性别与编号分开保存,找异性化为01数组找异或(sex数组女1男0)
    • 将每个集合先保存下来,之后遍历所有集合分别对情侣ab找他们与异性的最大亲密度,比较a与异性的最大亲密度等于b对a的亲密度,b与异性的最大亲密度等于a对b的亲密度即可。
  • 具体代码
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5;
    int n,m,k,a,b;
    int sex[N];//标记性别 
    vector<int>v[N];//存储m个集合 
    double x[N],y[N];
    void print(int a,int b){
    	if(sex[a])cout<<'-';cout<<a<<' ';
    	if(sex[b])cout<<'-';cout<<b<<endl;
    }
    double judge(int a,double d[]){//返回a与异性的最大亲密度 
    	double mx=d[0];//因为0有正负,既有可能是男0也有可能是女-0,所以0编号是都要比较的;或者最后直接一个for循环从0~n-1找最大值也可 
    	for(int i=0;i<m;i++){//遍历所有集合 
    		int f=0,k=v[i].size();
    		for(int j=0;j<k;j++){//判断a是否在该集合中 
    			if(v[i][j]==a){
    				f=1;break;
    			}
    		} 
    		if(!f)continue;
    		for(int j=0;j<k;j++){//a在该集合,则找该集合中的异性,计算最大好感度 
    			int t=v[i][j];
    			if(sex[t]^sex[a]){
    				d[t]+=1.0/k;
    				mx=max(mx,d[t]);
    			}
    		}	
    	}
    	return mx;
    }
    int main(){
    	string s;
    	cin>>n>>m;
    	for(int i=0;i<m;i++){
    		cin>>k;
    		for(int j=0;j<k;j++){
    			cin>>s;
    			int t=abs(stoi(s));
    			if(s[0]=='-')sex[t]=1;//标记性别 
    			v[i].push_back(t);//加入当前集合 
    		}
    	}
    	cin>>s;
    	a=abs(stoi(s));
    	if(s[0]=='-')sex[a]=1;//标记性别 
    	cin>>s;
    	b=abs(stoi(s));
    	if(s[0]=='-')sex[b]=1;//标记性别 
    	double q=judge(a,x),w=judge(b,y);//返回a,b与异性的最大亲密度
    	if(q==x[b]&&w==y[a]){//男女主对异性的最大好感度一致 
    		print(a,b);
    	}else{//不一致 
    		for(int i=0;i<n;i++)
    			if(x[i]==q)print(a,i);
    		for(int i=0;i<n;i++)
    			if(y[i]==w)print(b,i);
    	}
    	return 0; 
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值