洛谷 P6625 [省选联考 2020 B 卷] 卡牌游戏
洛谷 P6625 [省选联考 2020 B 卷] 卡牌游戏
Solution
每次操作的得分都是一个前缀和,即每次的得分为\(p=\sum_\limits{i=1}^ka_i(2\le k\le n)\)。那么只要选出所有大于\(0\)的\(p\)即可。
注意不能单选第一个,即\(k\not =1\)。
代码偏向模拟,略微写复杂了一点。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<limits.h>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#ifdef TH
#define debug printf("Now is %d\n",__LINE__);
#else
#define debug
#endif
using namespace std;
template<class T>inline void read(T&x)
{
char ch=getchar();
int fu;
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
x*=fu;
}
inline int read()
{
int x=0,fu=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-') fu=-1,ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*fu;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do{G[++g]=x%10;x/=10;}while(x);
for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
int n;
int a[100010];
int top;
LL ans;
int main()
{
n=read();
for(int i=n;i>=1;i--) a[i]=read();
top=n;
while(1)
{
// cout<<"top="<<top<<endl;
int now=a[top--]+a[top--];
while(top>0&&now<=0)
{
now+=a[top--];
}
if(now<=0) break;
ans+=now;
a[++top]=now;
if(top<=1) break;
}
cout<<ans<<endl;
return 0;
}
不难算出答案要开\(\text{long long}\)。