[Wf2014]Metal Processing Plant(金属加工厂) 之这是小少主用二分答案用得最6的一次(2S就跑完了嘛)

本文介绍了一种解决金属加工工厂问题的算法,通过枚举与二分结合的方法求解集合划分的最小价值。算法利用集合的单调性,通过大步跳跃的方式减少计算次数,达到快速求解的目的。时间复杂度看似玄学,但实则较快,可视为对数级别。
摘要由CSDN通过智能技术生成

题目

【问题描述】

  定义集合S的价值D(S)为:
  这里写图片描述
  现在给你n个元素,并给出其中任意两个元素之间的d(i,j)值,要你将这些元素划分成两个集合A、B。求min{D(A)+D(B)}。注:d(i,j)=d(j,i)。

【输入格式】

  输入数据的第一行是一个整数n,代表元素个数。
  之后n-1行描述的是d(i,j),这部分里,第i行包含n-i个整数,第i行第j列的整数代表的是d(i,i+j)。

【输出格式】

  输出只有一行,一个整数,代表min{D(A)+D(B)}。

【输入样例】

【样例1】
 5
 4 5 0 2
 1 3 7
 2 0
 4

【样例2】
 7
 1 10 5 5 5 5
 5 10 5 5 5
 100 100 5 5
 10 5 5
 98 99
 3

【输出样例】

【样例1】
 4

【样例2】
 15

【数据范围】

1 ≤ n ≤ 200
0<=d(i,i+j)<=10^9

分析

这道题目我们首先可以做到一个判定性问题,也就是给定A集合的最大元素x1,和B集合的最大元素x2,我们可以判定我们能否得到这样的两个集合,因此顺理成章的就有了枚举x1然后二分猜x2的情况,这样要跑几分钟(如果动态维护要快一些,可以几秒跑完,但是少主很懒唉)
后来少主发现我们可以用单调指针完成,因为两边都有单调性了,这样就差不多4秒可以跑完,但是少主家的题库每组数据1S,很伤呀
后来少主又尝试了二分、三分,虽然这个并没有单调性,但是可以过很多组数据,(加起来可以过完的哦,但是少主是不愿意这么做的)

在将少主这个很牛X的方法之前,我们先前通过枚举+二分猜得到了一个很有力的工具,也就是一旦确定了x1,我们就可以确定x2的最小值,那么少主就想能不能也让x1跳得快一点呢,由此便有了以下算法
步骤(注意,所有的A,B都是建立在两个集合的可行解上面的,也就是所有出现过的值,还要手动加上0,也是作为二分答案的一个很好的剪枝,并且对应答案也一定是可行解)
1、确定边界A=1,并且通过二分确定边界最小B,记录一次答案
2、让B减1,确定出对应的A的最小值(肯定不比原来小,而且是对应B的最小可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值