本文主要是介绍[省选联考 2020 B 卷] 卡牌游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
题目描述
输入
输出
样例
输入数据 1
输出数据 1
输入数据 2
输出数据 2
提示
分析
Code
题目描述
轩轩某天想到了一个卡牌游戏,游戏规则如下:
- 初始时轩轩的手中有自左向右排成一排的 nn 张卡牌,每张卡牌上有一个整数分值。
- 接下来,轩轩每次可以选取卡牌序列最左边的连续若干张卡牌(至少 22 张),将它们替换为一张新卡牌。新卡牌将插入到序列的最左端,它的分值为本次操作中被替换掉的卡牌的分值之和。
- 初始时轩轩总分为 00,每执行一次卡牌替换操作,新卡牌的分值将加到总分中。当序列长度为 11 时游戏结束,轩轩也可以在任意时刻结束游戏。
现在给出序列中各个卡牌的分值,请你来帮助轩轩计算他能够获得的最高总分是多少?
输入
第一行一个正整数 nn,代表卡牌的数目。
接下来一行 nn 个以空格分隔的整数,第 ii 个数字 a_iai 代表自左向右第 ii 张卡牌的分值。
输出
仅一行一个整数表示答案。
样例
输入数据 1
3
2 -1 2
输出数据 1
4
输入数据 2
7
-4 3 0 7 -3 -5 -3
输出数据 2
9
提示
样例解释 1
最优策略为,首先选择最左侧的两张卡牌,总分增加 2 + (-1) = 12+(−1)=1。此时轩轩选择的两张卡牌被替换为一张分值为 11 的卡牌,且被放入序列最左侧,此时自左向右卡牌的分值为 11 和 22。
接下来选择当前序列中所有卡牌,总分增加 1 + 2 = 31+2=3,总分为 44。此时轩轩选择的两张卡牌被替换为一张分值为 33 的卡牌,且被放入序列最左侧,此时序列中只有一张分值为 33 的卡牌,游戏结束。
样例解释 2
最优策略为,首先选择最左侧的四张卡牌,总分增加 (-4) + 3 + 0 + 7 = 6(−4)+3+0+7=6。此时轩轩选择的四张卡牌被替换为一张分值为6 的卡牌,且被放入序列最左侧,此时自左向右卡牌的分值为 6, -3, -5, -36,−3,−5,−3。
再选择最左侧的两张卡牌,总分增加 6 + (-3) = 36+(−3)=3,总分为 99。此时轩轩选择的两张卡牌被替换为一张分值为 33 的卡牌,且被放入序列最左侧,此时自左向右卡牌的分值为 3, -5, -33,−5,−3。
此时无论如何操作均无法使总分继续增大,轩轩选择结束游戏。
数据范围与约定
------------------------------------------------
分析
这个题目是一个标准的前缀和,只要判断一下前缀和是否大于0,如果大于0就说明有贡献。
需要注意一点的就是要从第二张牌开始(刚开始要拿两张牌)。直接上code
Code
#include<bits/stdc++.h>
using namespace std;
long long ans=0,a[100010],[100010];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];s[i]=s[i-1]+a[i];}for(int i=2;i<=n;i++){ //注意要从第二张牌开始。刚开始至少拿两张牌。if(s[i]>0) ans+=s[i];}cout<<ans;return 0;
}
这篇关于[省选联考 2020 B 卷] 卡牌游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!