题目大意:

希望在 k 步之内,将尽可能多的1移到相邻的位置上

这里依靠前缀和解决问题

我们用pos[i]保存第i个1的位置,这里位置我以1开始

用sum[i]保存前 i 个1从 0 点移到当前位置所需的步数

每次进行判断能否将 st 号 到 la 号的1移到相邻位置,我们要先清楚,为了使移动步数最少,我们需要固定中间的数保持它的位置不动,将两边的数向它靠拢

那么移动的步数就分为左右两侧

中间的数编号为 m = (st + la)>> 1

首先将左侧移到中间,将 m 也作为其中的一部分,我们先将这 (m-st+1)个数均移到 pos[m]的位置上,而原本已经移好了 sum[m] - sum[st-1]个位置

因为是相邻,所以要把都在pos[m]上的位置一个个左移,分别左移 0 , 1 , 2 。。。。到(m-st)

所以左半部分为 (ll)pos[m]*(m-st+1) - (sum[m] - sum[st-1])- (ll)(m-st+1)*(m-st)/2 ;

右半部分同样道理,但是这回是因为其本身所在位置更大,所以是

(sum[la] - sum[m-1]) - (ll)pos[m]*(la-m+1) - (ll)(la-m+1)*(la-m)/2 ;

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define ll long long
const int N = ;
char s[N];
int k , pos[N] ;
ll sum[N]; bool ok(int st , int len)
{
int la = st + len - ;
int m = (st + la) >> ;
ll ans = ;
ans += (ll)pos[m]*(m-st+) - (sum[m] - sum[st-])- (ll)(m-st+)*(m-st)/ ;
ans += (sum[la] - sum[m-]) - (ll)pos[m]*(la-m+) - (ll)(la-m+)*(la-m)/ ;
if(ans > k) return false;
return true;
} int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--){
scanf("%s%d" , s+ , &k);
int len = strlen(s+) , t = ;
for(int i = ; i<=len ; i++){
if(s[i] == '') pos[++t] = i;
}
for(int i = ; i<=t ; i++)
sum[i] = sum[i-] + pos[i];
int maxnLen = , st = ;
while(st + maxnLen - <= t){
if(ok(st , maxnLen)){
// cout<<"here: "<<t<<" "<<st<<" "<<maxnLen<<endl;
maxnLen ++;
}
else st++;
}
printf("%d\n" , maxnLen-);
}
return ;
}

最新文章

  1. 初识java之String与StringBuffer(上)
  2. js小功能整理
  3. WebApi防重复提交方案
  4. [VSTS]让ADO.NET Entity Framework支持Oracle数据库(转载)
  5. thinkphp实现导航高亮的简单方法
  6. Tinyxml的简单应用
  7. Android NDK 开发(一)--环境搭建【转】
  8. 制作qtopia-2.2.0和qt4文件系统
  9. Nutch的日志系统
  10. Android Studio导出Jar包
  11. 学习笔记——Java核心技术之接口、继承与多态练习题
  12. python_code list_2
  13. SpaceSyntax【空间句法】之DepthMapX学习:第二篇 输出了什么东西 与 核心概念
  14. USSD 杂记
  15. es elasticsearch-head安装
  16. MySQL死锁分析一例
  17. [WC2014]紫荆花之恋(动态点分治+替罪羊思想)
  18. 剑指Offer 34. 第一个只出现一次的字符 (字符串)
  19. [10]Windows内核情景分析---中断处理
  20. DateTimepicker中的星期问题

热门文章

  1. GoAhead4.1.0 开发总结一(移植)
  2. 洛谷 P1462 通往奥格瑞玛的道路(spfa+二分搜索)(4boy)
  3. Java实现日期时间对象的使用
  4. jQuery——表单应用(2)
  5. [转]T4系列文章之3:T4语法的介绍
  6. Android 仿淘宝头条竖直跑马灯式新闻标题及“分页思想
  7. python实现qq机器人qqbot
  8. python模块中的__all__属性
  9. git上手简洁手册
  10. 【C++】智能指针简述(三):scoped_ptr