打卡信奥刷题(1529)用C++实现信奥 P6120 [USACO17JAN] Hoof, Paper, Scissor S

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 1N105)。

接下来 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值