- 题目链接: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; }
L2-028 秀恩爱分得快(异或+暴力)
最新推荐文章于 2022-08-26 14:18:16 发布