社区讨论

求助!!!

学术版参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@minww9yg
此快照首次捕获于
2025/12/02 09:41
3 个月前
此快照最后确认于
2025/12/02 18:12
3 个月前
查看原帖
救救我吧,实在想不出正解
题目:

T547748 简单问题1(sum)

题目描述

给定序列 a[1...n]a[1...n],序列的一个子段 [l,r][l,r] 为序列中连续的一段 a[l,l+1,...,r]a[l,l+1,...,r],子段的和即为 a[l]+a[l+1]++a[r]a[l]+a[l+1]+…+a[r]
现在请你求出序列 aa最大的为奇数的子段和

输入格式

第一行包含1个整数 nn
第二行包含 nn 个整数 a[i]a[i]

输出格式

输出1个整数,代表答案;若答案不存在,输出 no solution

输入输出样例 #1

输入 #1

CPP
3
3 2 1

输出 #1

CPP
5

输入输出样例 #2

输入 #2

CPP
4
2 2 2 2

输出 #2

CPP
no solution

输入输出样例 #3

输入 #3

CPP
5
-3 12 -1 -7 9

输出 #3

CPP
13

说明/提示

对于30%的数据:1n10,a[i]101\le n\le 10, |a[i]|\le 10
对于50%的数据:1n100,a[i]1001\le n\le 100, |a[i]|\le 100
对于70%的数据:1n5000,a[i]1091\le n\le 5000, |a[i]|\le 10^9
对于100%的数据:1n106,a[i]1091\le n\le 10^6, |a[i]|\le 10^9
code:
CPP
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll n,a[1000005],ans,s[1000005];

int main(){
    ans = -1e18;
    cin >> n;
    for(int i = 1;i <= n;i++){
        cin >> a[i];
    }
    for(int i = 1;i <= n;i++) s[i] = s[i - 1] + a[i];
    for(int l = 1;l <= n;l++){
        for(int r = l;r <= n;r++){
            if(s[r] - s[l - 1] & 1) ans = max(ans,s[r] - s[l - 1]);
        }
    }
    if(ans != -1e18)cout << ans;
    else cout << "no solution";
    return 0;
}
悬二关

回复

4 条回复,欢迎继续交流。

正在加载回复...