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;
}