cawsl 2015-12-09 03:01 采纳率: 0%
浏览 1287
已结题

HDU4561 一直WA 不知道哪里错了 跪求提示 java版 不想直接拿答案谢谢

 package arithmetic;

import java.util.Scanner;

public class Main {
    public static int maxProduct(int[] list,int start,int end){
        int sum=0;//记录数组中-2的个数[start,end)
         if(start==end||start+1==end){
             return 0;
         }

        for(int i=start;i<end;i++){
            if(list[i]==-2) sum++;
        }

        if(sum%2==0){ 
            return end-start;}//第一种情况-2的个数是偶数,此时直接返回end-start的个数即可

        else {//一共有sum(奇数) 个 -2    减掉其中一个-2就可以了  减掉左边-2 或者右边-2 哪边短减掉哪边的
            //2 2 -2 2 2 -2 -2 2
            //               ---
            //0 1  2 3 4  5  6 7去掉6 7 即最终结果为6个连续最大
            int s=start,e=end;//肯定会存在一个-2
            for(int i=start;i<end;i++){
                if(list[i]==-2){ s=i;//从前往后数记录第一个-2 的坐标s 
                break;}
            }
            for(int i=end-1;i>=start;i--){
                if(list[i]==-2){ e=i;//从后往前数记录最后一个 -2的下坐标 e 
                break; 
                }
            }
            //比较左右两边如果需要去掉-2的长度

            //下面考虑只有一个-2的情况
            if(s==e){

                if((s-start+1)>(end-e)){
                    return s-start;
                }
                else return end-e-1;
            }


            else if((s-start+1)>(end-e)){//左边长度大于右边的话 就去掉右边最后一个-2 去掉比较短的-2
                return e-start;
            }
            else return end-s-1;//否则去掉左边的第一个-2
        }

    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner cin=new Scanner(System.in);
        int sets=cin.nextInt();
        int number;
        //int[] elements;
        for(int j=1;j<=sets;j++){
            int s=0;
            number=cin.nextInt();
            int[] elements=new int[number];
            int[] sign=new int[number+1];
            for(int i=0;i<number;i++){
                elements[i]=cin.nextInt();
                if(elements[i]==0){
                    sign[s++]=i;//将为0的数的下标记录下来    是第i+1个数
                }

            }
            sign[s]=number;//设置一个结束标志位
            int answer=0;
            int t=0;
             for(int p=0;p<=s;p++)//这个时候s= (0的个数 ) 因为我自己放进去了一个0的标识;即分开了多少个不含0的数组 
                {

                    answer=Math.max(answer,maxProduct(elements,t,sign[p])); //sign[p]是0的下坐标

                    t=sign[p]+1;     //t是下个不含0数组开始的下标 
                }
              System.out.printf("Case #%d: %d\n",j,answer);

        }

cin.close();
    }
}

  • 写回答

3条回答 默认 最新

  • 君莫傲 博客专家认证 2015-12-09 07:25
    关注

    我就不把代码全看完了,直接就可以了给你指出一个问题

    System.out.println();
    这段代码你知道是怎么写的吗
    “ ”与变量之间可以用","分离吗?
    至少用“+”对吧!
    再重头理一理把!

    评论

报告相同问题?

悬赏问题

  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错