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;
}