Face The Right Way G
题目链接:https://www.luogu.com.cn/problem/P2882
题意:
给定一个01序列,求如何将它若干段连续序列翻转后变为全1序列
输出翻转最小次数和翻转区间长度
思路:
发现当每个点只翻转一次是最优的
所以从左往右枚举翻转区间左端点
当然得先枚举区间长度
通过维护差分数组判断左端点是否需要翻转
当翻转区间右端点超过n时不成立
void solve(){
int n;cin>>n;
vector<int>a(n+1);
rep(i,1,n){
char ch;cin>>ch;
if(ch=='B')a[i]=0;else a[i]=1;
}
vector<pii>ans;
for(int len=1;len<=n;len++){
int ok=1;
int cnt=0;
vector<int>dif(n+2,0);
for(int i=1;i<=n;i++){
dif[i]+=dif[i-1];
if((a[i]==0&&dif[i]%2==0)||(a[i]==1&&dif[i]%2==1)){
if(i+len>n+1){
ok=0;break;
}
dif[i]++;dif[i+len]--;
cnt++;
}
}
if(ok){
ans.pb({len,cnt});
}
}
int res=llmax;
int temp=0;
for(int i=0;i<ans.size();i++){
if(ans[i].se<res){
res=ans[i].se;
temp=ans[i].fi;
}
}
cout<<temp<<' '<<res<<endl;
}

浙公网安备 33010602011771号