codeforces 962B Students in Railway Carriage
题目链接:http://codeforces.com/contest/962/problem/B
题意:给你一个长度为n的字符串s,然后A和B两种人各有a和b个。然后字符串s中有星和点两种字符。每个字符代表一个作为,其中点代表空座位,星代表座位被占。然后A种人和A种人不能坐在一起,B不能和B坐在一起。现在要你把这些人安排到空座位上,问最多可以安排多少人。
分析:为了放的人数最多,当当前座位是点,①如果前一个座位是星时,我们优先考虑放人数多的那种人②如果前一个座位是点(就是某一种人被消耗完了,前一个座位才会空开),我们优先考虑放人数多的那种人。(这个应该好理解吧,就是为了防止人数少的那种人用完了,最后人数多的那个只能分隔开,浪费空座位)③当前一个座位是‘A’时,我们只能放B,当前一个是‘B’我们只能放A。然后统计一下这样就可以AC了
AC代码:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 6 int main(){ 7 ios_base::sync_with_stdio(0); 8 cin.tie(0); 9 int n,a,b; 10 string s; 11 cin>>n>>a>>b; 12 cin>>s; 13 int sum=0; 14 if(s[0]=='.'){ 15 if(a>=b){ 16 s[0]='a'; 17 a--; 18 } 19 else { 20 s[0]='b'; 21 b--; 22 } 23 sum++; 24 } 25 for(int i=1;i<n;i++){ 26 if(a==0&&b==0) break; 27 if(s[i]=='.'){ 28 if(s[i-1]=='*'||s[i-1]=='.'){ 29 if(a>=b){ 30 s[i]='a'; 31 a--; 32 } 33 else { 34 s[i]='b'; 35 b--; 36 } 37 sum++; 38 } 39 else { 40 if(s[i-1]=='a'){ 41 if(b>0){ 42 s[i]='b'; 43 b--; 44 sum++; 45 } 46 } 47 else { 48 if(a>0){ 49 s[i]='a'; 50 a--; 51 sum++; 52 } 53 } 54 } 55 } 56 } 57 cout<<sum<<endl; 58 return 0; 59 }