标题:玩牌高手 | 时间限制: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%,不知道问题在哪儿……
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63//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; }
最后
以上就是温婉小鸽子最近收集整理的关于玩牌高手极其基本解法的全部内容,更多相关玩牌高手极其基本解法内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复