【HDU 1003】 Max Sum
题意
需要在o(n)时间内,求最大连续的子序列的和,及其起点和终点。
分析
一种方法是一边读,一边维护最小的前缀和 s[i] ,然后不断更新 ans = max(ans,s[j] - s[i]),以及起始位置。
另一种方法是尺取(算是吧),l 和 r 代表起点和终点,一开始l=0,r=1,如果s[r]-s[l]>=0那就往右扫 r++,不断更新 ans = max(ans,s[r] - s[l]),以及起始位置,如果小于0了,那就舍弃前面这段了,也就是后面必然不用考虑它更划算,l=r,r++。还要注意全是负数的情况,那就只要输出最大的那个负数。
代码
维护min(s[i])
#include <cstdio>
#include <algorithm> using namespace std; int test,n;
int a,k,ans,s[],st,en;
int main()
{
scanf("%d",&test);
for(int t=; t<=test; t++)
{
s[]=;
k=;
ans=-;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d",&a);
s[i]=s[i-]+a;
if(s[i]-s[k]>ans){
ans=s[i]-s[k];
en=i;
st=k+;
}
if(s[i]<s[k]){
k=i;
}
}
if(t<test)printf("Case %d:\n%d %d %d\n\n",t,ans,st,en);
else printf("Case %d:\n%d %d %d\n",t,ans,st,en);
}
return ;
}
尺扫
#include <cstdio>
#include <algorithm> using namespace std; int test,n,a,ans,s[],st,en,maxa,maxp;
int main()
{
scanf("%d",&test);
for(int t=; t<=test; t++)
{
maxa=-;
ans=;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d",&a);
s[i]=s[i-]+a;
if(a>maxa)
{
maxa=a;
maxp=i;
}
}
if(maxa<)
{
ans=maxa;
st=en=maxp;
}
else
{
int l=;
int r=;
while(r <= n)
{
while(s[r] >= s[l] && r<n)
{
r++;
if(s[r]-s[l]>ans)
{
ans=s[r]-s[l];
st=l+;
en=r;
}
}
l=r;
r++;
}
}
if(t<test)printf("Case %d:\n%d %d %d\n\n",t,ans,st,en);
else printf("Case %d:\n%d %d %d\n",t,ans,st,en);
}
return ;
}
【HDU 1003】 Max Sum的更多相关文章
- 【HDU 5381】 The sum of gcd (子区间的xx和,离线)
		
[题目] The sum of gcd Problem Description You have an array A,the length of A is nLet f(l,r)=∑ri=l∑rj= ...
 - HDU 1003:Max Sum(DP,连续子段和)
		
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
 - HDU  1003:Max Sum
		
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
 - 【HDU 5647】DZY Loves Connecting(树DP)
		
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
 - -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
		
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
 - 【HDU 2196】 Computer(树的直径)
		
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
 - 【HDU 2196】 Computer (树形DP)
		
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
 - 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
		
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
 - 【HDU 5145】 NPY and girls(组合+莫队)
		
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
 
随机推荐
- java13-5  JDK1.5以后的一个新特性和Integer的面试题
			
1.JDK5的新特性 自动装箱:把基本类型转换为包装类类型 自动拆箱:把包装类类型转换为基本类型 注意一个小问题: 在使用时,Integer x = null;代码就会出现NullPointerExc ...
 - Mina 中遇到SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
			
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaulting to no-op ...
 - ES6严格模式use strict下的保留字
			
implements interface let package private protected public static yield
 - /etc/profile和~/.bash_profile的区别
			
/etc/profile是全局的,是私有的 /etc/profile用于整个系统所有用户, ~/.bash_profile, ~/.profile和~/.bashrc 用于各个用户,这里的" ...
 - 【转】【C#】【Thread】【Task】多线程
			
多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回 ...
 - R语言利器之ddply和aggregate
			
ddply和aggregate是两个用来整合数据的功能强大的函数. aggregate(x, ...) 关于aggregate()函数的使用在<R语言实战>中P105有简单描述,这里重新说 ...
 - java String.getBytes()编码问题——String.getBytes(charset)
			
String的getBytes()方法是得到一个字串的字节数组,这是众所周知的.但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组.如果你在使用这个方法时不考虑到这一点,你会发现在一个平 ...
 - Linux Linux程序练习九
			
题目:利用多线程与有名管道技术,实现两个进程之间发送即时消息,实现聊天功能 思路:关键在于建立两个有名管道,利用多线程技术,进程A中线程1向管道A写数据,进程B中线程2从管道A读数据,进程A线程2从管 ...
 - Linux非root用户安装jdk和tomcat
			
转载自:http://blog.csdn.net/wuyigong111/article/details/17410661,进行部分修改 创建一个用户 sgmm,并在其用户目录里面安装 jdk和tom ...
 - Android中对JSONArray数组的指定项进行删除,更新。
			
首先假设有这么一个JSONArray JSONArray Array1;JSONArray ITEM = new JSONArray(); name为你获取要删除的字段名称,IETM就是你删除后得到的 ...