bzoj1704 / P2882 [USACO07MAR]面对正确的方式Face The Right Way
P2882 [USACO07MAR]面对正确的方式Face The Right Way
$n<=5000$?枚举翻转长度,顺序模拟就ok了
对于每次翻转,我们可以利用差分的思想,再搞搞前缀和。
(输出反了还交,真菜)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define N 10010 6 int n,a[N],s[N],p[N],ans,mnd=1e9; 7 int main(){ 8 scanf("%d",&n); char q[3]; 9 for(int i=1;i<=n;++i) 10 scanf("%s",q),a[i]=(q[0]=='B'); 11 for(int i=n,tot,ed;i>=1;--i){ 12 memset(p,0,sizeof(p));tot=0,ed=0; 13 for(int j=1;j<=n-i+1;++j){ 14 s[j]=s[j-1]+p[j]; 15 if((a[j]+s[j])&1)//该位需要翻转 16 ++s[j],--p[j+i],++tot; 17 } 18 for(int j=n-i+2;j<=n&&!ed;++j){ 19 s[j]=s[j-1]+p[j]; 20 if((a[j]+s[j])&1) ed=1;//判断剩下的是否有转到前面去 21 } 22 if(!ed&&tot<=mnd) mnd=tot,ans=i;//更新答案 23 }printf("%d %d",ans,mnd); 24 return 0; 25 }