元神生日会,与我何干?

7-7 原神生日会

分数 100

全屏浏览题目

切换布局

作者 ACM-CLUB

单位 东北大学秦皇岛分校

注:空、荧、派蒙均为游戏原神里的人名。

有a个空(男旅行者)和b个荧(女旅行者)在会场外排队参加原神生日会。不幸的是,会场里只有N个座位,而且已经有若干个派蒙(可以是0个)已经坐在会场里面了。

  • 每个男旅行者都希望坐在他边上的是女旅行者或者派蒙。
  • 每个女旅行者都希望坐在她边上的是男旅行者或者派蒙。

换句话说,男旅行者不希望和其他男旅行者坐一起,女旅行者不希望和其他女旅行者坐一起。

如果会场内没有符合旅行者心意的位置,那么旅行者会选择不参加原神生日会。

作为活动组织者的你,希望能参加生日会的旅行者尽可能的多,现在给出会场内每个派蒙的位置,请你求出最多有几个旅行者会来参加生日会。

输入格式:

输入共两行。
第一行有三数,分别为N,a,b(1≤n≤2∗105,0≤a,b≤2∗105,a+b>0)。表示会场内有N个位子,会场外有a个男旅行者,有b个女旅行者。

第二行是一个由字符"."和字符"P"组成的字符串。

"."表示空位,"P"表示这个位置被派蒙占了。

输出格式:

输出一个整数,表示最多可以有几个旅行者参加生日会。

输入样例:

在这里给出一组输入。例如:

11 3 10
.P....PP.P.

输出样例:

在这里给出相应的输出。例如:

7

样例解释

我们用P来表示派蒙,A来表示男旅行者,B来表示女旅行者,最终会场内的座位情况是这样的:BPABABPPAPB

其实很简单的思路。

每一个P把座位分成很多个小段,每个小段都是男女相间的去坐

对于每一个空段,不管是奇数个(2n+1),还是偶数个(2n),都可以至少先让n个男坐、n个女生坐。

不同的是,对于奇数个的座位,还有剩下的一个座位,要给男生和女生。

当时我在想:”那么对于奇数个,剩下的那个座位给男还是给女还要看前面的那2n个座位是男女男女还是女男女男,这位不就比较麻烦了吗?!"

愚蠢!💩

其实根本不用想这么多,因为前面的怎么放其实不必考虑,对参加会议的人数完全不会有影响!所以说,只需对奇数个空里面的那最后一个位置放人就可以了,男女什么的不必去管

那在这么放呢?

其实放男的放女的都可以了,所以,这时候就要取“剩下的男女总人数”和“剩下的空座位人数”的最大值。

不过 不要忘了另一种情况:男女人数提前用完。

🆗

原理搞明白了,生日会就搞出来啦!

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 200005;
int main()
{
	char c[maxn];
	int N, A, B;
	cin >> N >> A >> B;
	int now = 0; //  这个代表当前处理段落的长度
	int a = 0;
	int b = 0;
	int ans;
	int sum = 0;

	for (int i = 1; i <= N; i += 1)
	{
		cin >> c[i];
	}
	for (int i = 1; i <= N;)
	{
		if (c[i] == 'P')
		{
			++i;
		}
		else
		{
			for (now = 0; i <= N && c[i] == '.'; ++i)
			{
				now += 1;
			}
			int c, d;
			c = (now + 1) / 2;
			d = now - c;
			a += c;
			b += d;
			if (c != d)
			{
				sum += 1;
			}
		}
	}
	ans = min(a, A) + min(b, B);
	for (int i = 1; i <= sum; i += 1)
	{
		a -= 1;
		b += 1;
		ans = max(ans, min(a, A) + min(b, B));

	}
	cout << ans;
	return 0;
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值