剪刀石头布二(ptwo) 时限:1s 空间:256m

今天我们来讲一下一维差分

什么是差分呢?

比如有一个一维数组a,他的前缀和数组是b,那么a数组就是b数组的差分数组

也就是说,一个一维数组就是它的前缀和数组的差分数组

非常好理解是8

来看一下题目(又是非常简单的一维差分题a)

‘P’代表布,‘S’代表剪刀,‘H’表示石头。‘P’能赢‘H’,‘H’能赢‘S’,‘S’能赢‘P’。小愤同学与小千同学玩N轮游戏,给出小愤同学每一轮出的手势,小愤同学第i 轮游戏出的手势是f[i],其中f[i]是‘P’或者‘H’或者‘S’三种手势之一。小千同学比较懒,具体来说,他在整个N轮游戏过程中,最多只改变一次手势。小千同学想知道,在上述条件限制下,他最多能赢多少轮?

输入:第一行,一个整数N。  1 <= N <= 100000。
接下来有N行,第i 行是f[i]。f[i]是‘P’或者‘H’或者‘S’三种手势之一。

输出:一个正整数。

输入样例:

5
P
P
H
P
S

输出样例:

4
【样例解释】
小千出的手势依次是: S、S、S、S、H,能赢4轮。

相信大家不花10秒就能理解啊

给一下简陋的代码

#include<bits/stdc++.h>
using namespace std;
int n,p[100010],h[100010],s[100010],P,H,S,zd1,zd2,zzd;
char a[100010];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
	{
		if(a[i]=='P') p[i]=p[i-1]+1;
		else p[i]=p[i-1];
		if(a[i]=='H') h[i]=h[i-1]+1;
		else h[i]=h[i-1];
		if(a[i]=='S') s[i]=s[i-1]+1;
		else s[i]=s[i-1];
	}
	for(int i=1;i<=n;i++)
	{
		zd1=zd2=0,P=p[i],H=h[i],S=s[i];
		if(P>zd1) zd1=P;
		if(H>zd1) zd1=H;
		if(S>zd1) zd1=S;
		P=p[n]-p[i],H=h[n]-h[i], S=s[n]-s[i];
		if(P>zd2)  zd2=P;
		if(H>zd2)  zd2=H;
		if(S>zd2)  zd2=S;
		if(zd2+zd1>zzd)  zzd=zd2+zd1;
	}
	cout<<zzd;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
registerEvent () { let endPoint = cc.v2(0,0) let startPoint = cc.v2(0,0) this.node.on(cc.Node.EventType.TOUCH_MOVE, (e) => { startPoint = e.getStartLocation(); endPoint = e.getLocation(); const distance = startPoint.sub(endPoint).mag(); if (distance <= 300) { this.draw.clear(); this.draw.moveTo(startPoint.x, startPoint.y); this.draw.lineTo(e.getLocationX(), e.getLocationY()); this.draw.stroke(); } }, this); this.node.on(cc.Node.EventType.TOUCH_END, (e) => { this.draw.clear(); let lineStart = startPoint.clone(); // 保存 300 线段的起点 let lineEnd = endPoint.clone(); // 保存 300 线段的终点 this.cut(lineStart, lineEnd); // 在 cut() 方法中处理 300 线段 }, this); } cut(pOne,pTwo){ let ropeJoints: cc.RopeJoint[] = [] if(this.chapterOne.active === true){ //ropeJoints = cc.director.getScene().getComponentsInChildren(cc.RopeJoint); ropeJoints =this.chapterOne.getComponentsInChildren(cc.RopeJoint); } else if(this.chapterTwo.active === true) { //ropeJoints = cc.director.getScene().getComponentsInChildren(cc.RopeJoint); ropeJoints =this.chapterTwo.getComponentsInChildren(cc.RopeJoint); } ropeJoints.forEach((item) => { if(item.node.width ==10&&item.node.height==10){ let lineP1 = pOne; // 线段起点 let lineP2 = pTwo; // 线段终点 let rectPoint = cc.v2(item.node.x-5, item.node.y-5) let rectWorldPoint = item.node.convertToWorldSpaceAR(rectPoint) let rect = cc.rect(rectWorldPoint.x,rectWorldPoint.y, 20, 20); // 矩形,左下角坐标为(5,5),宽高为10 let isIntersect = cc.Intersection.lineRect(lineP1, lineP2, rect); console.log(isIntersect); // 输出 true 或 false if(isIntersect== true){ item.node.parent.active = false } } }); }
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值