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 }
View Code
原文地址:https://www.cnblogs.com/ls961006/p/8799218.html