小朋友的数字


题解:

最大字段和类似于DP,判断加上本次的数是否划算,另外用一个MAXN保存目前最大的字段和
如果加上本次的数不划算的话就将特征值赋为之前的最大字段和。对于分数,我们可以发现
分数总是一个不下降序列,因此,如果上一个的特征是小于0的,那么加上他就不划算,反之

则划算,加上它,最后我们就能得到一个不下降序列。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cctype>
#include<cmath>
#include<map>
#include<climits>
#define MAXA 1000005
#define MIN -1500000000
using namespace std;
typedef long long LL;
bool isFirst;
LL n,MOD;
LL temp[MAXA],Tezheng[MAXA],Fenshu[MAXA],hand[MAXA],MAXN;
int main() {
	scanf("%lld %lld",&n,&MOD);
	for(int i=1;i<=n;i++)
	    scanf("%lld",&hand[i]);
	temp[1] = Tezheng[1] = MAXN = hand[1];
	for(int i=2;i<=n;i++) {
		temp[i] = max(temp[i-1] + hand[i],hand[i]);
		Tezheng[i] = max(MAXN,temp[i]);
		MAXN = Tezheng[i];
	}
	Fenshu[1] = Tezheng[1];
	Fenshu[2] = Tezheng[1] + Fenshu[1];
	MAXN = Fenshu[2];
	isFirst = Fenshu[1] <= Fenshu[2] ? false : true;
	for(int i=3;i<=n;i++) {
		if(Tezheng[i-1] > 0) {
			Fenshu[i] = Fenshu[i-1] + Tezheng[i-1];
			isFirst = Fenshu[i] > Fenshu[1] ? false : true;
			if(Fenshu[i] > 10000000000)
			   Fenshu[i] %= MOD;
		}
		else
		  Fenshu[i] = Fenshu[2];
	}
	if(isFirst)
		printf("%lld",Fenshu[1] % MOD);
	else
	    printf("%lld",Fenshu[n] % MOD);
}

猜你喜欢

转载自blog.csdn.net/qq_41513352/article/details/79690586