2021.5.31(补)

1.cf Xenia and Colorful Gems

https://codeforces.com/problemset/problem/1336/B

大意:给定三个正整数列,长度分别位a,b,c。你需要在三个序列中各取一个数x,y,z,使得 ( x − y ) 2 (x-y)^2 (xy)2+ ( y − z ) 2 (y-z)^2 (yz)2+ ( z − x ) 2 (z-x)^2 (zx)2最小。

赛后看了一眼就知道大概思路了,比赛的时候因为去开了模拟题,看都没看,结果最后模拟题不仅没做出,这题还没机会做。血亏!!!

个人思路:首先使得和最小的,一定是x,y,z相距最近。很容易想到,如果我们确定了最优解三个数中的中间那个数在某个序列中。那么我们只需要通过二分查找,分别在另外两个序列中找到离他最近的两个数,那么最优解一定在几个数中产生,枚举各种情况求出最小值就行了。然后就是怎么确定中间那个数在那个序列呢?枚举不就好了嘛,维护最小值。

如果二分查找的时候不存在,直接取成边界就行了,不会影响最优解。

官方解思路:其实差不多。对于最优解x,y,z一定是 x<=y<=z 的三个数,枚举二分查找x,y,z。就行了。

总结:万恶的模拟题,吸取经验,模拟题慎开,因为模拟题一般都很费时间,还容易搞心态,如果某道模拟题过的人不多的话,先别急着开,先开有把握的。

2.POJ - 1723

给定n (n<=1e4),代表n个点,(数学坐标轴的形式),每次操作可以将点向上下左右其中一个方向移动一个单位,将所有的点移动到同一行,在一行中连续的最小操作步数。

思路:很显然,横纵坐标可以分别计算。

首先需要明确的在数轴上若干个点到某个点距离之和最小的情况是到他们排序好之后中间位置上的数,AcWing 的货仓选址就是这样的,可以画数轴很容易看出,所以移动到同一行的最小操作步数就很好算了。找中间位置上的数就行了。但对于数轴上的若干点到移动到某段连续的点最小操作步骤该怎么算呢?

假设移动的最优结果是以 a开头的一段连续的点 即 为 a a+1 a+2 … a+i

那么对应上原来的点 即将 x[0]移动到 a,x[1]移动到a+1 ,x[i]移动到 a+i

即将 x[0]-0 移动到 a, 将x[1]-1移动到a 将x[i]-i 移动到 a !!! 都是移动到a,也就是移动到同一点?和上面一样了,排序,找中间位置上的点,中间为位置有两个的话任意一个都行。

总结:当然此题说的点都是整数点(1)将数轴上若干个点移动到同一个点 最小步数等价于找一个点距离数轴上的点距离之和最小。求法:“排中”(2)将数轴上若干个点移动到一段连续的点最小步数等价于找一段连续的点距离数轴上的点距离之和最小。求法“排减排中”。

3.计蒜客 - 42580

大意:给定一个无向图,有n个点,m条边,有两种颜色:红色或者蓝色,需要选择这些边中的一部分边,使得任意两点间能连通,并且选择的蓝边不超过k条,输出满足条件的方案中最大的权重和。

思路还是很好想的,关键是用并查集怎么写。就是因为并查集写的少,结果最明显的错误却找了好久。

当感觉思路没问题的时候,仔细看看题有没有理解错,再想想有没有需要特判的地方,再仔细看看认为不会错的地方,不要有思维惯性。

具体思路如下: 实际上就是并查集求连通块,当最后所有点都在一个连通块中就是全部连通了,很显然对于红色的边没有限制,先全部连起来。对于蓝边按照权重从大到小排序,如果某条边能将两个连通块连起来,那么它一定是要选的,如果某条蓝边链接的两个点是在一个连通块内的,那么它就是暂时不需要的,先记录下来,这些边是完全连通后但是不足k条蓝边时,对最大权重和有贡献的。当所有边连完之后判断所有点是不是在同一个连通块中就行了。

总结:(1)并查集的写法(2)判断是所有点是不是在同一个连通块中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值