您的位置:首页 > 其它

ZCMU—1623

2016-12-08 14:12 239 查看

1623: 翻转序列

Time Limit: 1 Sec  Memory Limit: 128 MB

[Submit][Status][Web
Board]

Description

给你一串01序列,每次翻转连续k长度的序列(0变1,1变0),使所有的字符都变成0,要求翻转最小的次数,如果不存在输出T T.

Input

输入一个01串,

第二行输入一个k

01串长度,k<=100000.

Output

输出最小翻转次数,若不存在则输出T T

Sample Input

111

3

1111

3

Sample Output

1

T T

【分析】

一开始又以为是dp...稍微模拟一下就不难发现,其实并不需要考虑的那么复杂,这道题因为每次只能翻k个长度所以,只要从头扫描一遍,需要翻的就直接翻...
所以这道题就变成了如何模拟不超时的问题...那就不难了只要考虑当前判断的位置被翻了几次记录一下就好了~然后就是判断一下末尾k-1位是否有1如果有就T T
(感觉自己越来越蠢了.....)
【代码】
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
int a[101000];
char s[101000];
int k;
while(~scanf("%s%d",s,&k))
{
int len=strlen(s);
int x=0,sum=0,i;
memset(a,0,sizeof(a));
for(i=0;i+k-1<len;i++)
{
x+=a[i];
if((x%2==0&&s[i]=='1') || (x%2==1&&s[i]=='0'))
{
sum++;
x++;
a[i+k]--;
}
}
for(;i<len;i++)
{
x+=a[i];
if((x%2==0&&s[i]=='1') || (x%2==1&&s[i]=='0'))
{
printf("T T\n");
goto out;
}
}
printf("%d\n",sum);
out:;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: