一、题目内容
POJ 3276 原题地址
二、题意解释
有n头牛,每头牛要么面朝前方或者面朝后方。现在可以连续驱使连续的k头牛反转。求使得所有的牛面朝前方的最小操作数和对应的k是多少?
三、代码及注释
#include<cstdio>
#include<string.h>
using namespace std
;
const int Max_N
=5001;
int dir
[Max_N
],f
[Max_N
],n
;
int solve(int k
){
memset(f
,0,sizeof(f
));
int sum
=0,res
=0;
for(int i
=0;i
+k
<=n
;i
++){
if((dir
[i
]+sum
)%2!=0){
f
[i
]=1;
res
++;
}
sum
+=f
[i
];
if(i
-k
+1>=0){
sum
-=f
[i
-k
+1];
}
}
for(int i
=n
-k
+1;i
<n
;i
++){
if((dir
[i
]+sum
)%2!=0){
return -1;
}
if(i
-k
+1>=0) sum
-=f
[i
-k
+1];
}
return res
;
}
int main(){
memset(dir
,0,sizeof(dir
));
while(scanf("%d",&n
)!=EOF){
for(int i
=0;i
<n
;i
++){
getchar();
char ch
;
scanf("%c",&ch
);
if(ch
=='B'){
dir
[i
]=1;
}
}
int mink
=1,minres
=n
;
for(int k
=1;k
<=n
;k
++){
int tres
=solve(k
);
if( tres
>=0 && tres
<minres
){
minres
=tres
;
mink
=k
;
}
}
printf("%d %d\n",mink
,minres
);
}
return 0;
}
转载请注明原文地址:https://blackberry.8miu.com/read-6463.html