P6120 [USACO17JAN] Hoof, Paper, Scissor S
题目背景
本题与 金组同名题目 在题意上一致,唯一的差别在于对变手势次数的限制。
题目描述
你可能玩过“石头,剪刀,布”,这个游戏在奶牛中同样流行,不过它的名字变成了“蹄子,剪刀,布”。
“蹄子,剪刀,布”和“石头,剪刀,布”的规则十分类似,两只奶牛数到三,然后出一个代表蹄子,剪刀或布的手势。蹄子胜过剪刀,剪刀胜过布,布胜过蹄子。特别地,如果两只奶牛的手势相同,则视为平局。
现在 FJ 和 Bessie 要进行 N N N 轮对抗。Bessie 已经预测了 FJ 每一轮要出的手势。然而 Bessie 很懒,她最多只想变换一次手势。
现在请你帮 Bessie 求出她最多能赢多少轮。
输入格式
第一行输入一个整数 N N N( 1 ≤ N ≤ 10 5 1 \leq N \leq 10^5 1≤N≤105)。
接下来
N
N
N 行,每行一个字母,代表 FJ 这一轮出的手势。H
代表蹄子(Hoof),S
代表剪刀(Scissors),P
代表布(Paper)。
输出格式
输出一个整数,代表 Bessie 在最多变换一次手势的前提下最多赢多少轮。
输入输出样例 #1
输入 #1
5
P
P
H
P
S
输出 #1
4
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,s[100001],p[100001],h[100001],ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
s[i]=s[i-1];//s的前缀和
p[i]=p[i-1];//p的前缀和
h[i]=h[i-1];//h的前缀和
char c;
cin>>c;
if(c=='S')
s[i]++;
if(c=='P')
p[i]++;
if(c=='H')
h[i]++;
}
for(int i=1;i<=n;i++)
ans=max(ans,max(s[i],max(p[i],h[i]))+max(s[n]-s[i],max(p[n]-p[i],h[n]-h[i])));
cout<<ans;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容