玩牌高手极其基本解法

标题:玩牌高手 | 时间限制:1秒 | 内存限制:32768K | 语言限制:不限

给定一个长度为n的整型数组,表示一个选手在n轮内可选择的牌面分数。选手基于规则选牌,请计算所有轮结束后其可以获得的最高总分数。选择规则如下:

1、在每轮里选手可以选择获取该轮牌面,则其总分数加上该轮牌面分数,为其新的总分数。

2、选手也可不选择本轮牌面直接跳到下一轮,此时将当前总分数还原为3轮前的总分数,若当前轮次小于等于3(即在第1、2、3轮选择跳过轮次),则总分数置为0。

3、选手的初始总分数为0,且必须依次参加每一轮。

输入描述:

第一行为一个小写逗号分割的字符串,表示n轮的牌面分数,1<= n <=20。

分数值为整数,-100 <= 分数值 <= 100。

不考虑格式问题。

输出描述:

所有轮结束后选手获得的最高总分数。

示例1

输入

1,-5,-6,4,3,6,-2

输出

11

说明

总共有7轮牌面。

第一轮选择该轮牌面,总分数为1。

第二轮不选择该轮牌面,总分数还原为0。

第三轮不选择该轮牌面,总分数还原为0。

第四轮选择该轮牌面,总分数为4。

第五轮选择该轮牌面,总分数为7。

第六轮选择该轮牌面,总分数为13。

第七轮如果不选择该轮牌面,则总分数还原到3轮1前分数,即第四轮的总分数4,如果选择该轮牌面,总分数为11,所以选择该轮牌面。

因此,最终的最高总分为11。

下面是我的代码,但是测试用例通过率只有40%,不知道问题在哪儿……

//author:autumoon
//联系QQ:4589968
//日期:2021-12-22

#pragma once

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int g_three[3] = { 0 };

int PlayCards(int argc, char* argv[])
{
	string sInput;

	std::cin >> sInput;

	vector<int> vInputs;

	if (sInput.size() && sInput[sInput.length() - 1] != ',')
	{
		sInput += ',';
	}

	int nPos = sInput.find(',');

	while (nPos != std::string::npos)
	{
		string stTmp = sInput.substr(0, nPos);

		int nTmp = atoi(stTmp.c_str());

		if (nTmp >= -100 && nTmp <= 100)
		{
			vInputs.push_back(nTmp);
		}

		sInput = sInput.substr(nPos + 1);
		nPos = sInput.find(',');
	}

	if (vInputs.size() <= 0 || vInputs.size() > 20)
	{
		return -1;
	}

	//Input

	int nSum = 0;

	for (int i = 0; i < vInputs.size(); ++i)
	{
		int nCur = vInputs[i];

		if (nCur > 0)
		{
			nSum += nCur;
		}
		else
		{
			int nTmp = nSum + nCur;
			int nThreeBefore = g_three[2];

			if (nTmp > nThreeBefore)
			{
				nSum += nCur;
			}
			else
			{
				nSum = nThreeBefore;
			}
		}

		g_three[2] = g_three[1];
		g_three[1] = g_three[0];
		g_three[0] = nSum;
	}

	cout << nSum;

	return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值