题意:
给一个由 ' * ' 和 ' . ' 组成的串,有 a, b 两类人,* 不能坐人,. 可以坐人,且 a, b 不能相邻,问该串内最多能坐下多少人。
思路:
首先根据题意可知,需要比较a, b 的大小,肯定要先放多的,再把少的穿插进去,明白了这个,接下来就是怎么放了。
如果a >= b, 当我在串内找到1个 ' . ' ,我就看该点前一个元素是什么,
如果是 ' * ' , 那就把这个点赋成 'a' ; 如果是 'b' , 那也要赋成 'a', 那么就结束了?显然不是,并不是只有找到的点前面只有 ' * ' 和 ' a ', 才要将该点赋成 'a',如果该点前面是点,那说明少的元素已经消耗光了,这时也要将其赋成 'a'。
综上所述,当你找到的点前面只要不是 'a', 那就将它赋成 'a',反之,赋成 'b' 就ok了~
a < b是也是同理。
本人AC代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int Maxx = 2e5 + 7;
int n, a, b;
char s[Maxx];
int main() {
while(scanf("%d %d %d", &n, &a, &b) != EOF) {
scanf("%s", s);
for(int i = 0; i < n; i++) {
if(a >= b) {
if(s[i] == '.') {
if(s[i - 1] != 'a' && a > 0) {
s[i] = 'a';
a--;
}
else if(s[i - 1] == 'a' && b > 0) {
s[i] = 'b';
b--;
}
}
}
else {
if(s[i] == '.') {
if(s[i - 1] != 'b' && b > 0) {
s[i] = 'b';
b--;
}
else if(s[i - 1] == 'b' && a > 0){
s[i] = 'a';
a--;
}
}
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
if(s[i] == 'a' || s[i] == 'b') ans++;
}
printf("%d\n", ans);
}
}