Codeforces 962B 解题报告

本文介绍了一种算法,用于解决在由'*'和'.'组成的字符串中如何最优地安排两类人(a类和b类)就座的问题。a类和b类人不能相邻,算法的目标是在满足条件的情况下最大化就座人数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给一个由 ' * ' 和 ' . ' 组成的串,有 a, b 两类人,* 不能坐人,. 可以坐人,且 a, b 不能相邻,问该串内最多能坐下多少人。

思路:

首先根据题意可知,需要比较a, b 的大小,肯定要先放多的,再把少的穿插进去,明白了这个,接下来就是怎么放了。

如果a >= b, 当我在串内找到1个 ' . ' ,我就看该点前一个元素是什么,

如果是 ' * ' , 那就把这个点赋成  'a' ; 如果是 'b' ,  那也要赋成 'a', 那么就结束了?显然不是,并不是只有找到的点前面只有 ' * ' 和 ' a ', 才要将该点赋成 'a',如果该点前面是点,那说明少的元素已经消耗光了,这时也要将其赋成 'a'。

综上所述,当你找到的点前面只要不是 'a', 那就将它赋成 'a',反之,赋成 'b' 就ok了~

a < b是也是同理。

本人AC代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int Maxx = 2e5 + 7;
int n, a, b;
char s[Maxx];

int main() {
    while(scanf("%d %d %d", &n, &a, &b) != EOF) {
        scanf("%s", s);
        for(int i = 0; i < n; i++) {
            if(a >= b) {
                if(s[i] == '.') {
                    if(s[i - 1] != 'a' && a > 0) {
                        s[i] = 'a';
                        a--;
                    }
                    else if(s[i - 1] == 'a' && b > 0) {
                        s[i] = 'b';
                        b--;
                    }
                }
            }
            else {
                if(s[i] == '.') {
                    if(s[i - 1] != 'b' && b > 0) {
                        s[i] = 'b';
                        b--;
                    }
                    else if(s[i - 1] == 'b' && a > 0){
                        s[i] = 'a';
                        a--;
                    }
                }
            }
        }
        int ans = 0;
        for(int i = 0; i < n; i++) {
            if(s[i] == 'a' || s[i] == 'b') ans++;
        }
        printf("%d\n", ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值