Students in Railway Carriage
题目链接:CodeForces - 962B题意:一排座位,'.'表示空位, '*'表示座位有人, 一共n个座位, 现在有a个A, b个B, 要求A不能和A靠着,B不能和B靠着, 问做多能安排下多少个人;
当连续座位数是奇数时按ABABA样式做(A是数量大的那一类, 这样就能多坐下一个人), 偶数就无所谓了(两类人坐下的数量相同);
其实不管连续座位数是奇还是偶, 我们只管安排人数多的一类先做下, 这样再顺着来,那么是不是先要求出每个连续空座区间呢?
并不需要的, 这样想, 只要遇到空位, 就安排人数多的下坐下就好了, 并且该座位的前一个不是同类, 如果是同类, 那么安排另一类的坐下;
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[200010]; int seat[200010]; bool cmp(int a, int b){ return a>b; } int main(){ int n, a, b, ans=0; scanf("%d%d%d", &n, &a, &b); scanf("%s", s+1); s[0]='#'; for(int i=1; i<=n; i++){ if(a==0&&b==0) break; if(s[i]=='.'){ if(a>b){ if(s[i-1]!='A') s[i]='A', a--, ans++; else if(b>0) s[i]='B', b--, ans++; } else{ if(s[i-1]!='B') s[i]='B', b--, ans++; else if(a>0) s[i]='A', a--, ans++; } } } printf("%d\n", ans); return 0; }