关于稳定婚姻问题

c++计算单利和复利存款金额 //计算单利和复利存款金额 #include using namespace std; double simpleinterest(double principal,double interestrate,int year); double compoundinterest(double principal,double interestrate,int year); 阅读详情

其实这个东西比较好玩……

意义比较深远……

尤其是对广大屌丝和穷搓矮和魔法师而言……

这个问题在组合数学第9章出现

问的是:

n男n女,每个男的对每个女的有一个评分,每个女的对每个男的有一个评分,然后……

他们两两配对……

当然结婚以后有可能不幸福,所以希望找到一种配对方案,满足

不存在这样的一对(狗)男女,他们不在一起,同时对对方的评分比对自己配偶高……如果这样他们就会私奔啊私奔~~~~


这个很明显是二分图,但是不是单纯的二分图……

有一个Gale-Shapley算法(应该是叫这两个名字的两个人提出的),又称延迟认可算法

有两种做法,一种男性最优,一种女性最优

以男性最优为例:

①每一个男生向自己评分最高且没拒绝过自己的女性求婚(有可能有女性获得多个人的求婚)

②如果有女性获得多个人的求婚(即使已经订婚),那么挑选自己评分最高的,与其订婚,拒绝其他人

注意在②中,如果有女性已经订婚,那么她会比较订婚的人和向自己提出请求的人,选择评分高的那一个(这就是为什么是“订婚”而非结婚)

算法的正确性随便google一下就有

我想说的是为什么这个方案男性最优……一开始我也没太弄清

这与我们平常的观念不符——如果一个女生很受欢迎,那么她更容易挑到自己满意的人


但是有一点,有可能女生心仪的男生并不喜欢她,因此没能向她求婚

举个例子,有可能n个男生互相不是情敌,那么第一轮求婚以后,算法就结束了,此时每个男生都心满意足,而女生不一定……

然后接下来每次男生求婚都是挑的他觉得最好而且自己有机会的,而女生等啊等有可能都等不到想要的那个人……

而且需要注意的是稳定婚姻问题一定有解(就像屌丝最终会找到一个黑木耳……)



这给我们一个启示……手快有手慢无,一定要主动啊主动~~~~


特别说明以上对基佬不适用……(说不定也适用??)


题目有POJ3487,ZOJ1576,NOJ1710(南开大学OJ……第一次听说)

题目都差不多,都是裸的,输入的处理可能麻烦点(ZOJMS最麻烦,得用map……虽然实际上也比较好写)


POJ3487code:

//其实在处理被拒绝的男生的时候可以开队列,应该可以加快速度,但是事后才想起,就算了……反正数据范围小……

//在处理字符这一点上自认为写的很丑……暴丑……其实可以把数组开大,就可以不用减'A'了,当时有点脑残……

//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
using namespace std;
//Macro
#define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
#define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
#define erep(i,e,x) for(int i=x;i;i=e[i].next)
#define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define read() (strtol(ipos,&ipos,10))
#define sqr(x) ((x)*(x))
#define pb push_back
#define PS system("pause");
typedef long long ll;
typedef pair<int,int> pii;
const int oo=~0U>>1;
const double inf=1e20;
const double eps=1e-6;
string name="",in=".in",out=".out";
//Var
class P
{
public:
	bool exist;int married;
	int pri[60];
}person[60];
int n,pos[60],T;
void Init()
{
	memset(person,0,sizeof person);
	scanf("%d\n",&n);char ch,s[30];
	rep(i,1,n<<1)
		scanf("%c%*c",&ch),person[ch-'A'+1].exist=true;
	scanf("\n");
	rep(i,1,n)
	{
		scanf("%s",s+1);
		rep(i,3,strlen(s+1))
			person[s[1]-'A'+1].pri[i-2]=s[i]-'A'+1;
		pos[s[1]-'A'+1]=1;
	}
	rep(i,1,n)
	{
		scanf("%s",s+1);
		rep(i,3,strlen(s+1))
			person[s[1]-'A'+1].pri[s[i]-'A'+1]=i-2;
		person[s[1]-'A'+1].pri[0]=oo;
	}
}
void Set(int first,int second,int third)
{
	person[first].married=second;
	person[second].married=first;
	person[third].married=0;
}
void Work()
{
	int cnt=n;
	while(cnt)
	{
		rep(i,'a'-'A'+1,'z'-'A'+1)
		{
			if(person[i].exist&&!person[i].married)
			{
				int t=person[i].pri[pos[i]++];
				if(person[t].pri[i]<person[t].pri[person[t].married])
				{
					if(!person[t].married)cnt--;
					Set(t,i,person[t].married);
				}
			}
		}
	}
	rep(i,'a','z')
	{
		if(person[i-'A'+1].exist)
			printf("%c %c\n",i,person[i-'A'+1].married+'A'-1);
	}
}
int main()
{
//	freopen((name+in).c_str(),"r",stdin);
//	freopen((name+out).c_str(),"w",stdout);
	for(scanf("%d",&T);T;T--)
	{
		Init();
		Work();
		puts("");
	}
	return 0;
}


Java实现稳定婚姻问题 1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3…,mn}和一个女士的计划X = {n1,n2,n3,…,nn}。每一个男士有一个排序的列表,把女士按照潜在的优先级进行排序。同样,每一个女士也有一个男士的优先级列表。现在,把男士和女士进行配对,要求尽可能的符合优先级的要求。使得最终的配对结果,男士对女士都可接受,不会出现拒绝的情况,即每对男士和女士都是稳定的。 2 解决... 阅读详情

相关推荐

稳定婚姻问题(自己的总结)

稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时d也认为a比c好,那么ad就有可能私奔,这样就导致了婚姻的不稳定,稳定婚姻就是找到一种解决方案让婚姻稳定 算法:       稳定婚姻的解决方法比较简单,通俗易懂,而且还容易实现,具体有没有固定的模板我不知道,没有去找

天使也掉毛 4384

有以下结构: struct student{ char name[32]; int age; int class; bool sex; }; 写出函数,用函数重载的方式编写程

#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> using namespace std; struct student{ char name[32]; int age; int clas; bool sex; }; int countName(student * src,...

xiaoming1999的博客 5380

模板 - 稳定婚姻问题

题意:给定n个男人,n个女人,每个人心中对异性都有一个排序,从左往右是最喜欢到最不喜欢,然后现在要求一个稳定匹配,使得n对男女中,不存在男人对其他女人好感度大于配偶且女人对其他男人好感度大于配偶 思路:稳定婚姻问题,算法过程如下: 男人不断求婚,从最喜欢到最不喜欢,女人每次在求婚人中,选择一个最喜欢的配对,然后抛弃现在的配对,这个过程可以用一个队列存放求婚男人,这样直到队列为空,也就匹配完毕了 typedef long long ll; const int N = 5007, M = 5000007.

繁凡さん的博客 636

稳定婚姻问题

ACM模版稳定婚姻问题/* * 稳定婚姻问题O(n^2) */ const int N = 1001; struct People { bool state; int opp, tag; int list[N]; // man使用 int priority[N]; // woman使用,有必要的话可以和list合并,以节省空间 v

逐梦者 1438

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战)

本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。

weixin_28607671的博客 497

BUUCTF逆向题Youngter-drive

其实线程一代码我自己也不大理解,看了正确的 flag 后,我自己推出来的是这样:在 couece 中取出字符,然后在 QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm 中找出一样的,取出该字符在 QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm 中的下标,如果取出的字符是大写则 在ASCII中找出【下标 - 38】值对应的字符替换couece中的字符,同理,小写就减 96。

于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。 1090

稳定婚姻问题算法

<br /><br />转自:http://teruterubouzu-laputa.spaces.live.com/<br />话说在1962年,两个数学家David Gale 和Lloyd Shapley提出了下面的问题:<br />给定若干个男生和同样多的女生,他们每个人都对所有的异性有一个心理的偏好次序。是否存在一种男女配对组合构成一种稳定的组合关系?这里稳定组合的意思是说,不存在两个非伴侣的异性对彼此的评价比对各自伴侣的评价还要高。(可以理解,这样的异性太容易红杏出墙了,所以是某种不稳定因素。)进

弓虽子 2079

CSAPP performance lab

CSAPP 深入理解计算机系统的performance Lab

weixin_46091531的博客 1250

Poj 3487 稳定婚姻问题

稳定婚姻问题:有n个男人,n个女人。每个人都有一个对异性的排名(1~n),假设男人主动追求女人,根据这些排名,我们需要将这些男女进行牵线,使得他们的婚姻稳定。     由于稳定不太好定义,我们定义一下不稳定。 不稳定婚姻:对于任意一个男人m, 假设其当前配偶为w, 若存在一个女人w1, 其当前配偶为 m1, 她在m 的排名中比 w 靠前,同时,m在 w1 的排名中比她现任丈夫 m1靠前,这

Pekary 2060

vivado时序分析 实例

vivado时序分析实例建立余量保持余量 建立余量 保持余量

Bunny9__的博客 1万+

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3350

【稳定婚姻问题】

稳定婚姻是组合数学里面的一个问题。 问题大概是这样:有一个社团里有n个女生和n个男生,每位女生按照她的偏爱程度将男生排序,同时每位男生也按照自己的偏爱程度将女生排序。然后将这n个女生和n个男生配成完备婚姻。 如果存在两位女生A和B,两位男生a和b,使得A和a结婚,B和b结婚,但是A更偏爱b而不是a,b更偏爱A而不是B,则这个婚姻就是不稳定的,A和b可能背着别人相伴而走,因为他俩都认为,与当前配

leolin_的专栏 1764

MediaCodec视频解码流程详解及参考demo

本文主要讲解mediacodec的视频解码流程,及demo参考例子。

分享音视频技术 7872

【稳定婚姻问题】【HDU1435】【Stable Match】

2015/7/1 19:48

学习之路 3340

PCB盲埋孔工艺全解析:从机械钻孔到激光钻孔的进阶之路

本文全面解析了PCB盲埋孔工艺,对比了机械钻孔与激光钻孔两种核心技术的工艺流程、优势与局限。机械钻孔成本低、工艺成熟,适用于常规孔径;激光钻孔则能实现微孔、叠孔等复杂HDI结构,精度更高。文章深入探讨了如何根据孔径、成本、板厚及产品需求选择合适工艺,并强调了设计与制造协同的重要性,为高密度PCB设计提供实用指南。

weixin_29306317的博客 682

16QAM调制解调仿真(matlab,详细介绍仿真方案的设计、结果及结论、完整代码及注释)

16QAM调制解调仿真目录一、仿真要求二、仿真方案详细设计三、仿真结果及结论四、仿真代码 一、仿真要求 1.用基带等效的方式仿真16-QAM在AWGN信道下的误码率和误比特率性能,并与理论值相比较; 2.高阶与低阶的性能比较。 二、仿真方案详细设计 三、仿真结果及结论 仿真结果 16QAM的星座点图 64QAM的星座点图 16QAM加噪声后的星座点图 64QAM加噪声后的星座点图 16-QAM载波调制信号在AWGN信道下的误比特率性能比较 结论:由图可知,16QAM的误符号率

mango 5万+
上一篇: NOI2007.Day2.T3.追捕盗贼
下一篇: Topcoder.SRM527.Div1.T2
OrpineX
博客等级 码龄17年 16粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值