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);    }}

原创粉丝点击