华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1058|回复: 2
打印 上一主题 下一主题

P1115 最大子段和

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-6-29 17:49:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1115

题目描述
给出一段序列,选出其中连续且非空的一段使得这段和最大。

输入输出格式
输入格式:
第一行是一个正整数 N ,表示了序列的长度。

第二行包含 N 个绝对值不大于10000 的整数 A_i,描述了这段序列。

输出格式:
一个整数,为最大的子段和是多少。子段的最小长度为 1 。

输入输出样例
输入样例#1:
7
2 -4 3 -1 2 -4 3
输出样例#1:
4
说明
【样例说明】

2,-4,3,-1,2,-4,3 中,最大的子段和为4,该子段为 3,-1,2

【数据规模与约定】

对于40% 的数据,有 N≤2000 。

对于 100% 的数据,有 N≤200000 。
回复

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
沙发
 楼主| 发表于 2018-8-15 09:18:46 | 只看该作者
有多种做法,每种做法都应该试验一下,可以学到很多的编程思想
1、盲目穷举 起点,终点,循环计算总和,判断最大值,三重循环,很好理解,编程也很好实现
2、利用前缀和,减少一重循环,前缀和也是一种很普适的思想,编程不难,体验一下
3、二分法
4、精妙的累加判断法。
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
板凳
发表于 2018-8-25 16:50:26 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,a[200001];
  4. long long ans=-400000,x;
  5. int main()
  6. {
  7.     cin>>n;
  8.     for(int i=1; i<=n; i++)
  9.     {
  10.         cin>>a[i];
  11.         x+=a[i];
  12.         if(x>ans)ans=x;
  13.         if(x<0)x=0;
  14.     }
  15.     cout<<ans;
  16.     return 0;
  17. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-27 05:25 , Processed in 0.151801 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表