您的位置:首页 > 其它

1704: [Usaco2007 Mar]Face The Right Way 自动转身机

2017-12-25 21:04 453 查看
题目链接

题目大意:有一个长度为n的01序列,需要全部置为1,操作一次可以选择一个固定的k(每次操作均相同),将连续k个数取反

求出k,使得在操作次数最少的前提下k尽量小

题解:枚举k,顺序扫描,每当遇到一个为0的数,就以它为起点进行修改,修改用差分实现

我的收获:……

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <cstdlib>
using namespace std;

const int M=5005;

int n,a[M],b[M],c[M];
int mi_cnt,mi_tim=M;
char str[5];

void solve(int k)
{
memcpy(b,a,sizeof(b));
memset(c,0,sizeof(c));
int nowtime=0;
for(int i=1;i<=n;i++){
c[i]+=c[i-1],b[i]+=c[i];
if(b[i]&1){
if(i+k-1>n) return ;
else c[i]++,c[i+k]--,nowtime++;
}
}
if(nowtime<mi_tim) mi_tim=nowtime,mi_cnt=k;
}

void work()
{
solve(20);
for(int i=1;i<=n;i++) solve(i);
cout<<mi_cnt<<" "<<mi_tim<<endl;
}

void init()
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%s",str),a[i]=(str[0]=='B');
}

int main()
{
init();
work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: