【2016-CCPC-K】匈牙利算法,最大基数匹配(Kingdom of Obsession,hdu 5943)

博客讲述了如何使用匈牙利算法解决最大基数匹配问题,通过实例分析和数据简化,阐述了将问题转化为二分图并应用算法的过程。文章指出在大数据情况下寻找规律或转换思路的重要性,并讨论了特殊情况的处理方法。
摘要由CSDN通过智能技术生成

打的重现塞,比赛时第一个就看这题,看完后一脸懵逼,觉得除了暴力贪心枚举以外想不到其他解法了。而且这样贪心还肯定是错的= =。

n个数给每个数都找一个位子,使得满足条件。事实上这就是一个匹配问题,自己做的题太少了,所以没感觉。

n和s最大可以取到1e9。这么大的数据怎么办呢?答案就是要么先找找规律取取巧,把问题化简,要么就换思路。

这题就是把区间[1+s,n+s]的数放到区间[1,n]中。

设x为区间[1+s,n+s]中的数,y为区间[1,n]中的数。

要让所有的x满足x%y==0。

先考虑两个区间相交的情况。

那么相交部分就直接放到对应编号的位子上就好了,因为x都是最小的那些,y都是最大的那些。


试着证明一下。

关键是怕抢了不该抢的位子是不。

如果x只能放在这里,那就不算抢。

否则设x还可以放在Y,Y<y,x%Y==0。

对于某个X>x,若可以放在y,则X%y==0,因为y==x,且x%Y==0,推出X%Y==0,所以X也一定能放在Y,所以也没有抢。


那剩下的怎么办呢,或者说终究得考虑区间不相交的情况。

因为素数只能放在1号或自己编号的位子,所以若区间[s+1,n+s]中若有2个以上的素数,那就至少有一个素数没地方放,那就绝对不行。我们知道两个素数之间的间隔是很小的(相对于素数的大小而言)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值