原题链接: https://atcoder.jp/contests/abc174/tasks/abc174_d?lang=en
测试样例
Sample Input 1
4
WWRR
Sample Output 1
2
例如,下面的两个操作将达到目的。
交换 第1个 和 第3块石头,导致RWWR。 更改 第4个石头,产生RWWW
Sample Input 2
2
RR
Sample Output 2
0
是不需要任何操作的情况。
Sample Input 3
8
WRWWRWRR
Sample Output 3
3
解题思路: 题目的意思就是需要将所有的R都移到最左边去,那么我们换个理解,其实就是让最右边的R和最左边的W交换,最往中间靠拢,直到最右边的R的位置大于最左边的W的位置。那么这个我们可以利用双端队列存储W和R的位置来模拟。 具体看AC代码。
AC代码
/*
。
*
*/
//POJ不支持
using namespace std;
const int inf=0x3f3f3f3f;//无穷大。
const int maxn=1e5;//限定值。
typedef long long ll;
int n;
int main(){
while(cin>>n){
string s;
cin>>s;
deque<int> pos1;
deque<int> pos2;
int len=s.size();
rep(i,0,len-1){
if(s[i]=='W'){
pos1.push_back(i+1);
}
else{
pos2.push_back(i+1);
}
}
int cnt=0;
while(!pos1.empty()&&!pos2.empty()){
int temp1=pos1.front();
int temp2=pos2.back();
if(temp1<temp2){
cnt++;
pos1.pop_front();
pos2.pop_back();
}
else{
break;
}
}
cout<<cnt<<endl;
}
return 0;
}