连续最大积 hdu 4567
连续最大积
HDU ID: 4561
64位整型: Java 类名:
下一题
题目描述
比如我们有如下随机数组:
2 2 0 -2 0 2 2 -2 -2 0
在这个数组的众多连续子序列中,2 2 -2 -2这个连续子序列的积为最大。
现在小明请你帮忙算出这个最大值。
输入
接下来的T组数据,每组数据第一行输入N,表示数组的元素总个数(1<= N <= 10000)。
再接下来输入N个由0,-2,2组成的元素,元素之间用空格分开。
输出
如果最终的答案小于等于0,直接输出0
否则若答案是2^x ,输出x即可。
每组数据占一行,具体输出格式参见样例。
样例输入
2 2 -2 0 10 2 2 0 -2 0 2 2 -2 -2 0
样例输出
Case #1: 0 Case #2: 4
来源
下一题
管理员 QQ 1532958223
思路:刚看到这题以为是dp,但怎么都想不对的,我用的方法,
开始提交时,过了,但是后来又提交 ,超时,同样的代码,不知
道是不是后台数据出问题了,上网查了一下,看到一个思想特别
好的代码,就借鉴一下(思想也特别简单)把我的代码也粘贴出
来,大神可以指点一下。
想了几组数据大家可以测试一下,对比一下结果,寻找一下代码
的误区。
3
2 -2 2
3
-2 2 2
6
2 -2 2 -2 2 -2
6
-2 2 -2 2 -2 2
大神的:
#include <stdio.h>
int main()
{int T,n,a[10010],i,j,k,sum,MAX,flag;scanf("%d",&T);k=1;while(T--){scanf("%d",&n);for (i=0; i<n; i++)scanf("%d",&a[i]);MAX=0;sum=0;for (i=0; i<n; i++){if (a[i]>0){if (sum<0){sum=sum-1;}elsesum=sum+1;}else if (a[i]<0){if (sum<0){sum=-sum+1;}elsesum=-sum-1;}elsesum=0;if (sum>MAX){MAX=sum;}}sum=0;for (i=n-1; i>=0; i--){if (a[i]>0){if (sum<0){sum=sum-1;}elsesum=sum+1;}else if (a[i]<0){if (sum<0){sum=-sum+1;}elsesum=-sum-1;}elsesum=0;if (sum>MAX){MAX=sum;}}printf("Case #%d: %d\n",k++,MAX);}return 0;
}
我的:
#include<stdio.h>
#include<string.h>
int a[10000+1];
int main()
{int t,n,h=0;scanf("%d",&t);while(t--){scanf("%d",&n);int m,term=0,k=0,max=0,s=0;for(int i=0; i<n; i++)scanf("%d",&a[i]);for(int i=0; i<n; i++){if(!a[i])continue;term=0; k=0;s=0;for(int j=i; j<n; j++){if(a[j]==0)break;else{if(a[j]==-2){k++;s=0;}else s++;term++;}if(k%2==0&&k&&term>max)max=term;if(term>max&&k==0)max=term;if(k%2&&s>max)max=s;}}printf("Case #%d: %d\n",++h,max);}return 0;
}
改进的:
#include<stdio.h>
#include<string.h>
int a[10000+1];
int main()
{int t,n,h=0;scanf("%d",&t);while(t--){scanf("%d",&n);int m,term=0,k=0,max=0,s=0;for(int i=0; i<n; i++)scanf("%d",&a[i]);for(int i=0; i<n; i++){if(a[i]==0){term=0;k=0;s=0;continue;}if(a[i]==-2){k++;s=0;}else s++;term++;if(k%2==0&&term>max)max=term;if(k%2&&s>max)max=s;}term=0; k=0; s=0;for(int i=n-1; i>=0; i--){if(a[i]==0){term=0;k=0;s=0;continue;}if(a[i]==-2){k++;s=0;}else s++;term++;if(k%2==0&&term>max)max=term;if(k%2&&s>max)max=s;}printf("Case #%d: %d\n",++h,max);}return 0;
}
连续最大积 hdu 4567相关推荐
- hdu4561 连续最大积
题意: 连续最大积 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- 杭电4561 连续最大积
连续最大积 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- hdu 4561 模拟小题or连续最大积
Description 小明和他的好朋友小西在玩一个游戏,由电脑随机生成一个由-2,0,2三个数组成的数组,并且约定,谁先算出这个数组中某一段连续元素的积的最大值,就算谁赢! 比如我们有如下随机数组: ...
- 【动态规划】Part1
1. 硬币找零 题目描述:假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. 分析: dp [0] = 0 dp [1] = 1 + ...
- [转]常见的动态规划问题分析与求解
动态规划(Dynamic Programming,简称DP),虽然抽象后进行求解的思路并不复杂,但具体的形式千差万别,找出问题的子结构以及通过子结构重新构造最优解的过程很难统一,并不像回溯法具有解决绝 ...
- Leecode-动态规划专题训练
动态规划问题基本解题步骤 设计状态 写出状态转移方程 设置初始状态 处理非法状态 执行状态转移 后处理 返回最终结果 显式转移方程 斐波那契数列 阶乘 隐式转移方程 爬楼梯 爬楼梯最小花费 注意:对于 ...
- 生命,宇宙以及一切事物的答案是...42?
"那个伟大的问题,关于生命.宇宙以及一切的问题的答案是--" "42."深思用无限的威严和平静的语调说. 01 终极问题的终极答案 英国作家道格拉斯·亚当斯(D ...
- 2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答
2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答 简介 赛题构成 代码提交说明 成绩评定 2020真题 1-1 数字与相邻的前.后数字之和可以被4整除 题目 个人对 ...
- 动态规划与贪心算法比较
动态规划和贪心算法比较 动态规划: 动态规划一般分为线性动规.区域动规.树形动规.背包动规四类 动态规划程序设计师是对解最优化问题的一种途径.一种方法,而不是一种特殊的算法,并不是一个标准的数学表达式 ...
- hdu 5247 找连续数(思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 找连续数 Time Limit: 2000/1000 MS (Java/Others) M ...
最新文章
- css定位页面元素,页面元素定位-CSS元素基本定位
- linux c语言文件属性,Linux C获取文件属性
- 网络推广专员浅析网络推广期间网站收录如何提升?
- python turtle循环图案-Python内置模块turtle绘图详解
- lame,把ios录音转换为mp3格式
- mysql master host_mysql异步备份的有关问题,MASTER_HOST可否指定多个
- python机器学习库xgboost——xgboost算法
- I/O多路复用之select,poll,epoll简介
- VS.net2005的稳定性真的很差劲
- 1.ECMAScript 6简介(阮一峰ES6)
- 整流四 -三相PWM整流器的工作原理分析
- 学校选课网筛选器的设想
- 部落优势服务器,魔兽怀旧服联盟优势服有哪些?怀旧服联盟优势服务器一览
- PointNetGPD: Detecting Grasp Configurations from Point Sets
- 关于图像打印的思考.
- es的基本操作(创建索引,添加数据,删除数据,判断索引是否存在)
- Win10 wsl-安装教程
- C语言的函数定义和函数声明
- CheckBox选中触发事件 和 取消选中触发事件
- BINARY和VARBINARY类型