最近在集中刷题,全部都写的话有点费时间,以后就只记录做得比较困难了。
这道题一入眼我首先想到的是双指针,但是仔细考虑一下发现左右指针轮流右移的思路行不通,如果一定要用双指针,需要右指针扫描完了回到起点再操作,这就和暴力法没什么区别了。
我想到另一种思路,创建一个数组pos[]记录每个1的位置。
我们结合一个例子来分析一下一般情形,针对如下的pos[]:

2 4 9 10 14 18

考虑第5个1,位置是14,假如k=3,第2个1的位置是4。
那么包含9,10,11这三个1的所有可能性可以表示为:
右侧滑动范围(14,18],左侧滑动范围((4,9],可能性有(18-14)*(9-4)=20种。
然后改变末位1的位置求得总共的可能性。

下附代码:

package main

import "fmt"

func main()  {
   
	var k,ans int
	var str string
	fmt.Scan