P1982 [NOIP2013 普及组] 小朋友的数字 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这里感谢题解区老哥的题解,这里附上他这道题题解的链接题解 P1982 【小朋友的数字】 - Kaizyn 的博客 - 洛谷博客 (luogu.com.cn)
(折磨我一个小时的题)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const long long LNF=0x3f3f3f3f3f3f3f3f;
int n,m;
long long s[N];//读入值
long long f[N];//特征值
long long sum[N];//分数
long long maxx[N];//结果值
int main(){
scanf("%d %d",&n,&m); f[0]=-LNF;
int flag=0;
for(int i=1;i<=n;i++) scanf("%lld",&s[i]);
for(int i=1;i<=n;i++) f[i]=max(f[i-1],(long long)0)+s[i];
for(int i=1;i<=n;i++) f[i]=max(f[i],f[i-1]);
if(f[1]>0) flag=1;
long long num=0;
for(int i=2;i<=n;i++){
num+=f[i];
if(num>=-f[1]){
flag=1; break;
}
}
sum[1]=f[1]; maxx[1]=(sum[1]+sum[1])%m;
for(int i=2;i<=n;i++){
sum[i]=maxx[i-1];
maxx[i]=(max(maxx[i-1],sum[i]+f[i]))%m;
}
if(flag) printf("%lld\n",sum[n]);
else printf("%lld\n",f[1]%m);
return 0 - 0;
}