1052 最大M子段和

N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的。如果M >= N个数中正数的个数,那么输出所有正数的和。
例如:-2 11 -4 13 -5 6 -2,分为2段,11 -4 13一段,6一段,和为26。

Input
第1行:2个数N和M,中间用空格分隔。N为整数的个数,M为划分为多少段。(2 <= N , M <= 5000)
第2 - N+1行:N个整数 (-10^9 <= a[i] <= 10^9)
Output
输出这个最大和
Input示例
7 2
-2
11
-4
13
-5
6
-2
Output示例
26———————————————————————————————————1254 最大子段和 V2
N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的。当所给的整数均为负数时和为0。
例如:{-2,11,-4,13,-5,-2, 4}将 -4 和 4 交换,{-2,11,4,13,-5,-2, -4},最大子段和为11 + 4 + 13 = 28。
 

Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9)
Output
输出交换一次后的最大子段和。
Input示例
7
-2
11
-4
13
-5
-2
4
Output示例
28——————————————————————————因为这两道题是一种写法所以我就写在一起就把连续的一段正负的合在一起得到一段正负相间的序列然后记录一共有多少个正的记为tot 题目要保留的段数记为 k那么我们就需要消掉tot-k份 消掉的方法有放弃某一段正的或者是用一段负的把两段正的合并这样我们维护一个堆 权值是需要付出的代价 这样慢慢合并就能解决问题了记得记录每一段的相邻段就好辣 当然记得特判边界 我的处理方法是加一段权值为负无穷的段就好辣

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define LL long long
using namespace std;
const int M=1e6+1e5+7;
const LL inf=1e15;
LL read(){LL ans=0,f=1,c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
int n,k,f[M],lx[M],rx[M];
LL cnt,sum[M],v,ans;
bool pd(LL x,LL y){return !x||!y||(x>0)==(y>0);}
LL pabs(LL x){return x>=0?x:-x;}
struct node{LL w,pos;bool operator <(const node& x)const{return x.w<w;}
};
priority_queue<node>q;
int main(){n=read(); k=read();int h=1; while(h<=n&&(v=read())<=0) h++;//printf("[%d]\n",h);if(v>0) sum[++cnt]=v;for(int i=h+1;i<=n;i++){v=read();if(pd(sum[cnt],v)) sum[cnt]+=v;else sum[++cnt]=v;}if(pd(sum[cnt],-inf)) sum[cnt]+=-inf;else sum[++cnt]=-inf;int tot=0; for(int i=1;i<=cnt;i++)if(sum[i]>=0) ans+=sum[i],tot++;if(tot<=k) return printf("%lld\n",ans),0;int now=tot-k;for(int i=1;i<=cnt;i++) q.push((node){pabs(sum[i]),i}),lx[i]=i-1,rx[i]=i+1;lx[1]=cnt; rx[cnt]=1;while(now){node x=q.top(); q.pop();int k=x.pos;if(f[k]) continue;ans-=x.w; now--;LL l=lx[k],r=rx[k];f[l]=1; f[r]=1;sum[++cnt]=sum[k]+sum[l]+sum[r];q.push((node){pabs(sum[cnt]),cnt});lx[cnt]=lx[l]; rx[cnt]=rx[r];rx[lx[l]]=cnt; lx[rx[r]]=cnt;  }printf("%lld\n",ans);return 0;
}

View Code

1115 最大M子段和 V3

环形最大M子段和,N个整数组成的序列排成一个环,a[1],a[2],a[3],…,a[n](a[n-1], a[n], a[1]也可以算作1段),将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的。如果M >= N个数中正数的个数,那么输出所有正数的和。
例如:-2 11 -4 13 -5 6 -1,分为2段,6 -1 -2 11一段,13一段,和为27。
 

Input
第1行:2个数N和M,中间用空格分隔。N为整数的个数,M为划分为多少段。(2 <= N , M <= 100000)
第2 - N+1行:N个整数 (-10^9 <= a[i] <= 10^9)
Output
输出这个最大和
Input示例
7 2
-2
11
-4
13
-5
6
-2
Output示例
26

————————————————————————这道题不需要特判边界反而更容易QAQ

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define LL long long
using namespace std;
const int M=1500007;
LL read(){LL ans=0,f=1,c=getchar();while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
LL lx[M],rx[M],w[M];
LL n,k,tot;
LL cnt=1;
LL sum[M],ans;
bool f[M];
struct node{LL w,pos;bool operator<(const node &x) const{return w>x.w;}
};
priority_queue<node>q;
LL pd(LL x){return x>=0?x:-x;}
bool okay(LL a,LL b){return (a<0&&b<0)||(a>0&&b>0)||!a||!b;}
int main()
{LL v;n=read(); k=read();for(int i=1;i<=n;i++){v=read();if(okay(sum[cnt],v)) sum[cnt]+=v;else sum[++cnt]=v;}if(okay(sum[1],sum[cnt])) sum[1]=sum[cnt]+sum[1],cnt--;for(int i=1;i<=cnt;i++) if(sum[i]>0) ans+=sum[i],tot++; if(tot<=k){printf("%lld\n",ans); return 0;}LL now=tot-k;q.push((node){pd(sum[1]),1}); lx[1]=cnt; rx[1]=2; w[1]=pd(sum[1]);q.push((node){pd(sum[cnt]),cnt});lx[cnt]=cnt-1; rx[cnt]=1; w[cnt]=pd(sum[cnt]);for(int i=2;i<cnt;i++)  q.push((node){pd(sum[i]),i}),lx[i]=i-1,rx[i]=i+1,w[i]=pd(sum[i]);while(now){node x=q.top(); q.pop();LL k=x.pos;if(f[k]) continue;ans-=w[k]; now--;LL l=lx[k],r=rx[k];f[l]=1; f[r]=1;cnt++;sum[cnt]=sum[k]+sum[l]+sum[r];w[cnt]=pd(sum[cnt]);q.push((node){w[cnt],cnt});lx[cnt]=lx[l]; rx[cnt]=rx[r];rx[lx[l]]=cnt; lx[rx[r]]=cnt;  }printf("%lld\n",ans);return 0;
}

View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7443289.html

51nod 最大M子段和系列相关推荐

  1. 51nod 1049 最大子段和

    题目: N个整数组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续子段和的最大值.当所给的整数均为负数时和为0. 例如:-2,11,-4,13, ...

  2. 【51nod】最大子段和

    题面 以一个长为n的数列,求连续子段的最大值. 思路1 直接枚举O(n^3)TLE稳稳的 #include<iostream> using namespace std; int n, a[ ...

  3. 51nod 1275 连续子段的差异

    分析: 1.首先是尺取,尺取到每一个区间,区间满足这个条件,最大-最小<=k; 2.对于一个动态区间,怎么维护他的最大值,最小值(的下标):--单调队列: 什么时候删掉头结点呢? 当我找到了当前 ...

  4. 51nod 1275 连续子段的差异(twopointer+单调队列)

    对于每一个i找到最近的j满足最大值-最小值>K,对答案的贡献为j-i,用单调队列维护最值即可 #include<iostream> #include<cstdlib> # ...

  5. 【单调队列】51nod 1275 连续子段的差异

    题面在这里 单调队列的经典题-- 发现一个合法的区间的所有子区间都是合法的 那么枚举右端点,维护最小的左端点 相当于每次加入一个值,然后右移左端点,使得区间内的差值≤k\le k 如何快速获取最大/最 ...

  6. 51nod 1115 最大M子段和 V3

    环形最大M子段和,N个整数组成的序列排成一个环,a[1],a[2],a[3],-,a[n](a[n-1], a[n], a[1]也可以算作1段),将这N个数划分为互不相交的M个子段,并且这M个子段的和 ...

  7. 【51nod - 1050】循环数组最大子段和(dp)

    题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...

  8. 【51nod - 1065】 最小正子段和( 前缀和排序 )

    题干: N个整数组成的序列a11,a22,a33,-,ann,从中选出一个子序列(aii,ai+1i+1,-ajj),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如: ...

  9. 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

    先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...

最新文章

  1. javascript中判断对象是否为空几种场景
  2. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要流程分析
  3. php时间调用最简单的,PHP调用时间通过引用不可避免?
  4. sqlserve 热备用状态更新_燃气地暖一个月费用多少钱?看完收藏备用
  5. ios11最新版本_iOS11.2.5 beta6怎么升级 哪些设备可以升级iOS11.2.5系统【详解】
  6. lecture7-序列模型及递归神经网络RNN
  7. vs2010使用svn--浅谈AnkhSvn
  8. 线性代数知识荟萃(4)——矩阵相抵
  9. Rust:字符串数组的拼接、与 String 、 str的选择
  10. java使用IO打印流输出到文件
  11. After Effects - Bodymovin 插件验货及感受
  12. 打开只能在微信客户端打开的链接
  13. 嵌入式软件工程师岗位要求
  14. PC 先驱克拉克逝世 曾参与开发首款晶体管 PC
  15. 张文宏教授再发“霸气”言论!面对疫情,一个真正的大国是什么样子?
  16. linux服务器视频转换,linux下视频格式转换工具
  17. 什么是反射机制?反射机制有什么作用?
  18. PHP代码审计16—ThinkPHP代码审计入门
  19. 梅梅之最新设计——改了又改!!~~
  20. java+selenium+chromedriver 整页截屏

热门文章

  1. 预训练是 AI 未来所需要的全部吗?
  2. 机器学习系列19:将核函数应用于支持向量机
  3. IDC:2018年中国人工智能市场规模达17.6亿美元
  4. SAP MM 没有维护MRP 视图的物料可以正常参与采购业务
  5. 业界丨涨薪20%!听听这位资深机器学习面试官的内心独白
  6. 《用Python进行自然语言处理》第 9 章 建立基于特征的文法
  7. Point-to Analysis指针分析(1)
  8. 2021年深度学习哪些方向比较有研究潜力?
  9. 从火热到理性,2019年AI芯片行业发展的怎么样了?【附PPT下载】
  10. 中国17种稀土有啥军事用途?没它们,美军技术优势将归零