C - Boboniu and String

C - Boboniu and String

这无疑是一道很好的题目,我没有什么思路。

通过观看某谷大佬的博客,花了很久才得以AC!

正如这是是一道好题,所以写一篇题解,也算是检验自己有没有掌握这一个问题。

题目有一些赘余,简单阐述一下题意:就是给你一系列的"BN"串,顾名思义"BN"串只由’B’,或者’N’组成,让你构造一个"BN"串,让它经过一系列的操作后能转换为所给的"BN"串('B’与’N’的个数一样就是相等的),求所有转换次数中最大的那个,使之最小化!

操作有6种:加’B’,加‘N’,加‘BN’,减’B’,减’N’,减‘BN’。

求什么最大值最小化,优先考虑二分,三分,但也要得到一个有单调性图像才行,二分是一种数学方法,充分利用了计算机的算的能力。有点扯远了。

回到题目,我们知道用二分,如何转换呢?二分枚举什么呢?

考虑二分枚举答案,答案是什么,答案就是你最大的转换次数。

其实并不是所有所给的‘BN’串都是要转换这个次数的。但是我们如果将所有的‘BN’串都转换这一个次数或者少于,是否能将所有的串装换为所求的。

我们可以把每个所给的"BN"串抽象转换为’B’与‘N’的个数,问题就变成了,构造一个有多少B’与‘N’的串,在最小的次数内转换为每个串。

我们可以把’B’与‘N’的个数看作笛卡尔坐标系上的x和y,即我们可以得到所给一系列的串的坐标,我们似乎明白了什么。如果把所有的串抽象成点,那么我们的答案,就是求最小圆覆盖,突然来到了计算几何,有点傻眼了。仔细一想,不是最小圆覆盖,因为圆心要求是整数。

继续考虑二分,很明显我们所给的每个点,都可以想六个方向转移,即x–,y–,x–&&y–,x++,y++,x++&&y++,很接近了答案了对于每个点,我们可以得到这样的一个图形:


这图是官方题解那拿的

我们对所有的所给点都求这个图形,找到交集,再利用二分,找到最小的那个交集,即为所求答案,这部分就是高中数学中的线性规划,式子就不列了。

我们求出x_max,x_min,y_max,y_min,x-y_max,x-y_min,在带回原式中得出一个正解即可。

代码不贴了!

还是发一下吧! /doge

#include <stdio.h> 
int main(){
    printf("Hello World!\n");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值