Description:ios
非 * 号的地方能够放A或B,不能AA或BB,一共有a个A,b个B,问你最多放几个spa
Solution:
1.模拟一下,找连续空位长度,若是长度为奇数,则我能够有一个位置听任意一个,不然摆放消耗必定,最后放完了判断一下是否是还有剩下的,有剩下的就都放到任意位置
Codecode
#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]='\0'; 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\n",ret); } return 0; }
2.小贪心,按位置模拟,能放的时候就先放个数最多,直到结束blog
codeip
#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\n",ret); } return 0;}