洛谷 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}\)

posted @ 2021-03-05 10:33  Vanilla_chan  阅读(181)  评论(0编辑  收藏  举报