最大子串和与最小子串和
做了牛客哈理工的一套训练赛的题目,真的是知识欠缺严重啊,首先补一下这个最大和最小子串和的问题。
求一个数组中连续一段和的最大值和最小值问题
最大值函数代码
ll maxsum() //最大和
{ll sum=0,maxx=-2147483647;for(int i=0;i<n;i++){sum += a[i];if(sum > maxx)maxx = sum;if(sum < 0)sum = 0;}return maxx;
}
最小值函数代码
int minsum() //最小和
{int sum1=0,minn=2147483647;for(int i=0;i<n;i++){sum += num[i];if(sum < minn)minn = sum;if(sum > 0)sum = 0;}return minn;
}
原题链接:寂寞如雪
原题内容:
题目描述
格雷福斯因为由于不知名力量失去了战斗力,需要启明小朋友为他点烟才能恢复力量,格雷福斯需要的烟是一种名为寂寞如雪的烟,启明小朋友需要截取一段连续的寂寞制作成寂寞如雪帮助格雷福斯恢复力量。
寂寞可以看做一段连续的01字符串,其中0表示落寞,1表示孤独,格雷福斯只需要孤独不需要落寞。因为格雷福斯只有两发子弹,所以格雷福斯不喜欢偶数。多个连续出现的孤独可以看做一段孤独,寂寞如雪中第奇数段长度为n的孤独可以为格雷福斯提供n2点力量,第偶数段长度为n的孤独会减少格雷福斯n2点力量,启明小朋友不知道格雷福斯最多可以恢复多少点力量,所以向你求助。
输入描述:
输入共一行,一个长度不超过1e6的字符串。
输出描述:
一个整数,最多可以恢复的力量。
输入:
111011001111100111
输出:
30
样例解释:
截取1110110011111,获得的力量为3^2-2^2+5^2=30
备注:
连续的1在计算时会被算成一段,不可以拆成多段
第奇数段还是第偶数段是看截取后字符串中的位置
题解:先对01字符串进行统计,统计出连续的1的个数分别是多少,因为截取之后,该段要么为第奇数段要么为第偶数段,所有该段的值要么为正数要么为负数,一共这两种情况,只需要计算这两种情况中的最大和最小值即可
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
ll a[N];//第一段为正
ll af[N];//第一段为负
ll n;
ll maxsum() //最大和
{ll sum=0,maxx=-2147483647;for(int i=0;i<n;i++){sum += a[i];if(sum > maxx)maxx = sum;if(sum < 0)sum = 0;}return maxx;
}
ll maxsumf() //最大和
{ll sum=0,maxx=-2147483647;for(int i=0;i<n;i++){sum += af[i];if(sum > maxx)maxx = sum;if(sum < 0)sum = 0;}return maxx;
}
int main()
{string s;cin >> s;int cnt = 0;bool flag = 0;for(int i = 0;i < s.size();i++){if(s[i] == '1'){//等于一时间计数,并且将flag标记为1记录cnt++;flag = 1;}else{if(flag){//s[i] == '0'如果这个时间flag被标记说明是前一段1刚结束,将计数的cnt加入数组中a[n] = cnt*cnt;af[n] = a[n];cnt = 0;if(n % 2 == 0){a[n] = -a[n];}else{af[n] = -af[n];}n++;flag = 0;}}}
// for(int i = 0;i < n;i++){
// cout << a[i] << " ";
// }
// cout << endl;cout << max(maxsum(),maxsumf());
}
最大子串和与最小子串和相关推荐
- 求周期字符串的最小子串
示例:输入abcabcabc,此时最小的子串是abc,长度为3,输出3. 直接给出代码进行讲解 import java.util.Scanner; public class minstring {pu ...
- java最小子串覆盖_LeetCode 76. 最小覆盖子串
LeetCode 76. 最小覆盖子串 题目 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBAN ...
- 72.Minimum Window Substring(最小子串窗口)
Level: Hard 题目描述: Given a string S and a string T, find the minimum window in S which will contain ...
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...
最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac 文章来源:勇幸|Thinking (http://www.ahathi ...
- 数据结构求子串、非空子串、真子串、非空真子串数
子串.非空子串.真子串.非空真子串,求数公式及例子 子串 非空子串 真子串 非空真子串 (1+n)∗n2+1\frac {(1+n)*n}{2}+12(1+n)∗n+1 (1+n)∗n2\frac ...
- 子串、真子串、非空子串、非空真子串的求解方法(数据结构)
** 字串.真子串.非空子串.非空真子串的求解方法 ** Eg:串S="software" 子串的求解方法 n(n+1)/2 +1 此处n为8,所以串S的子串为37 真子串的求解方 ...
- c语言 替换字符串中的子串,字符串中的子串替换
在很多编程语言中,都封装了字符串替换的操作,那么我们这里自己用C语言来实现一个字符串替换的函数.具体需求为:Replace(String S,String T,String V),用V替换主串S中出现 ...
- java最小子串覆盖_Java 算法-最小子串覆盖
今天在lintCode上做了一道题,感觉有必要将它记录下来. 1. 概览 (1).题意 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. ...
- 滑动窗口解决最小子串问题 leetcode3. Longest Substring Without Repeating Characters
问题描述: Given a string, find the length of the longest substring without repeating characters. Example ...
最新文章
- u盘文件看得见却打不开_【U盘】国产开源U盘启动制作工具
- mysql 慢查询过多_MySQL 慢查询优化
- Numpy 之 copies and Views
- spring整合CXF
- 花一天时间踩了node npm的一个坑
- ArcGIS模型操作
- 深入解读Linux内存管理系列(总览)
- C#判断一个字符串是否全部为空格的一个简单方法
- 华为机型深色模式下问题
- Greensock平台
- UEditor富文本编辑器图片粘贴和上传问题
- echarts世界地图国家及中国城市的经纬度数组整理
- 计算机英语名词简释及省略解释
- hbase1.2.1配置kerberos
- Velocity之vm页面注释
- 有关计算机知识竞赛的新闻稿,知识竞赛通讯稿5篇
- 评分卡模型(一)评分卡建模实战
- printf(%d%d%d%d\n, a,b,c);
- Latex中自动引用参考文献的方法,一分钟搞定
- Win32汇编练习(SMU—循环结构)