题解:P14258 好感(favor)
Ghostcoder · · 题解
这里提供一个简单易懂的贪心+模拟方法。
思路
使用模拟的思路很简单。
因为把所有浮板翻成正面朝上和反面朝上使用的思路相同,所以这里以把所有浮板都翻成
那么我们要怎样才能保证移动的距离总和最小呢?
首先注意到如果翻了最后一个
但是是不是所有时候都可以将最后一个
所以,最终的贪心方法是:
- 当最前面的字符为
ch 时,将它先翻面。 - 最前面的字符不是
ch 时,翻动最后一个ch 。
由于每翻动一次浮板,影响到的是前面和自身的所有浮板,所以考虑使用两个指针
初始化
输入字符串
指针
开始模拟
我们使用一个 while 循环,当两个指针
首先考虑指针
再考虑指针
循环的每一次,
最后返回累加的移动时间就是将所有浮板翻动成
代码解决
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,n;
string s;
int count(string s,char ch){
int l=1,r=-1,ans=0;
for(int i=1;i<=n;i++)if(s[i]==ch)r=i;
if(r==-1)return 1e9;
while(l<=r){
if(s[l]==ch){
ans++;
s[l]='#';
}
if(s[r]==ch){
ans+=(r-l+1);
l++;
}
r--;
}
return ans;
}
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>T;
while(T--){
cin>>n>>s;
s=" "+s;
cout<<min(count(s,'1'),count(s,'0'))<<"\n";
}
return 0;
}