Description:
非 * 号的地方可以放A或B,不能AA或BB,一共有a个A,b个B,问你最多放几个
Solution:
1.模拟一下,找连续空位长度,如果长度为奇数,则我可以有一个位置放任意一个,否则摆放消耗一定,最后放完了判断一下是不是还有剩下的,有剩下的就都放到任意位置
Code
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 2e5 + 2e2; char s[maxn]; int main() { int n,a,b; int numa,numb; while(~scanf("%d%d%d",&n,&a,&b)) { numa = a; numb = b; scanf("%s",s); s[n] = '*'; s[n+1]=' '; int last = -1; int use = 0; for(int i = 0;i < n + 1;++i) { if(s[i] == '*') { int len = i - last - 1; if(len & 1)use++; a -= len / 2; b -= len / 2; last = i; } } int ret = 0; if(a <= 0) { ret += numa; a = 0; } else ret += numa - a; if(b <= 0) { ret += numb; b = 0; } else ret += numb - b; ret += min(a+b,use); printf("%d ",ret); } return 0; }
2.小贪心,按位置模拟,能放的时候就先放个数最多,直到结束
code
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 2e5 + 2e2;
char s[maxn];
int main()
{
int n,a,b;
while(~scanf("%d%d%d",&n,&a,&b))
{
scanf("%s",s);
int ret = 0;
for(int i = 0;i < n;++i)
{
if(a < b)
swap(a,b);
while(s[i] == '.' && i < n)
{
if(a > 0)ret++;
a--;
swap(a,b);
i++;
}
}
printf("%d ",ret);
}
return 0;
}