hdu 4561 模拟题
来源:互联网 发布:js防水涂料 编辑:程序博客网 时间:2024/06/06 03:52
/*模拟题 思路: 我的思路是如果一串连续的0,我就存一个0在另外的数组里面,如果一串连续的2我就存 多少个2在另外一个数组里,如果一串连续的-2我就存多少个-2在另外一个数组里(-2)用负单位保存例如:输入数据为 2,-2,2,2,0,0,-2,-2,-2,2,2,2,-2我另外一个数组里面存的则是 1,-1,2,0,-3,3,-1而计算最大的值 我们只需要把连续是数字的绝对值加起来,然后像上面的话我们加起来最大的应该是3+3+1 也就是最后三个数字的绝对值。然后我们在用另外一个sum统计负数 的绝对值,那么另外一个sum中的值则是 4,另外一个sum 是-3和-1的绝对值。也就是这一连串数字中负数的个数。然后判断他是不是偶数,如果是偶数,那么乘积最大的2就是 7,因为四个负数负负得正了,这样子连起来是最大的。还有一种情况 如果是负数的个数为奇数的话,就表示最后乘起来为负数。就得将负数的个数减去1;例如下面 这组数据。0,-2 -2 2 -2 ,0这组数据放到另外一个数组里 为 x[0]=0,x[1]=-2,x[2]= 1,x[3]=-1,a[4]=0然后连续不为0数绝对值的和尾 4,但是 另外一个sum=3;也就是负数有三个,那么我们就要减去一个负数。这组数据也好办。直接从区间开头或者结尾减去都可以。所以最终的sum=sum-1;这种的话。2 2 -2 -2 2 -2 2x【0】=2,x[1]=-2,x[2]=1,x[3]=-1,x[4]=1;这种的话就就要分情况讨论,因为区间的头和尾不是负数,所以不能直接减去1.我们要剪去头和尾,两者最小的再减去1;那么这里 就等于sum=2+2+1+1+1+1减去min(x[4],x[0])-1=5;就是纯模拟了。*/#include<stdio.h>#include<string.h>#include<stdlib.h>using namespace std;int a[50010];int x[50010];int n;int main(){ int t; scanf("%d",&t); int cas=1; while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int count=1; for(int i=1;i<=n;i++)//统计连续相同数字的个数放入x数组 { int sum=0; int j=i; for(;a[j]==a[i]&&j<=n;j++) { sum++; } if(a[i]==2) x[count++]=sum; else if(a[i]==-2) x[count++]=(-sum); else x[count++]=0; i=j-1; } int max=-999999999; for(int i=1;i<count;i++) { int sum=0; int sum1=0; int j=i; if(x[i]!=0) { for(;j<count&x[j]!=0;j++)//将连续不为0的区间和累加起来。 { if(x[j]<0) sum1+=abs(x[j]);//负数的个数。 sum+=abs(x[j]); } j--; if(sum1%2==0)//当负数的个数为偶,和就为sum; { if(max<sum) max=sum; } else { if(x[j]<0||x[i]<0) {//当负数的个数奇,并且头部和尾部有一个是负数。 sum--; if(max<sum) max=sum; } else if(x[j]>x[i]) {//都不是负数就减去头部喝尾部连续的整数小的的个数。 sum--; sum=sum-x[i]; if(max<sum) max=sum; } else { sum--; sum=sum-x[j]; if(max<sum) max=sum; } } } i=j; } if(max==-999999999) printf("Case #%d: %d\n",cas++,0); else printf("Case #%d: %d\n",cas++,max); }}
阅读全文
0 0
- hdu 4561 模拟题
- hdu 4561 模拟小题
- hdu 4561 水模拟
- HDU 4561 模拟
- hdu 3269 模拟题
- HDU 4770 模拟题
- HDU 4772 模拟题
- hdu 1049 模拟题
- HDU 4930 模拟题
- hdu-1103 模拟题。
- hdu 4770 模拟题
- hdu 4801模拟题
- hdu 4801模拟题
- HDU 2158 模拟题
- HDU 6205 模拟题
- HDU 4350 Card 模拟题
- hdu 3436 splay模拟题
- HDU 1228 模拟水题
- i2c 协议解析
- 树的遍历及二叉树实现
- OJ 中,提交代码时,C++ 和 G++的区别
- Hdu6124 Euler theorem(2017多校第7场)
- POJ3170Knights of Ni
- hdu 4561 模拟题
- HTTP协议:工作原理
- 新建git项目,没有项目内容,怎样创建项目并上传
- java包的命名规则
- 2017 搜狗校招c++工程师笔试试卷
- 使用kotlin来提高安卓开发效率
- Java知识(接口和匿名类)
- hibernate多表操作2(七)一对一、多对多
- 排序一个数组要求时间复杂度为O(N)