Я новичок в кодировании. Ввод программы показывает всегда 0 вывод при использовании ввода из консоли - PullRequest
0 голосов
/ 27 января 2020

когда я запускаю свой код, он всегда показывает 0 как вывод. этот код о бинарном поиске. и я использую буфер чтения для ввода.

import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{ 
public static void main (String[] args) throws java.lang.Exception
{  
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   Main mainclass= new Main();
    int t =Integer.parseInt(in.readLine()); 

    for(int i = 0;i<t;i++)
    {   StringTokenizer tokenizer = new StringTokenizer(in.readLine());
        int N = Integer.parseInt(tokenizer.nextToken());
        int C = Integer.parseInt(tokenizer.nextToken());

    int[] arr= new int[N];
           for(int x=0;x<N;x++)
             {  arr[i] =Integer.parseInt(in.readLine());} 

        int res=  mainclass.bs(N,C,arr);
     System.out.println(res);
    }

}

это метод bs () внутри класса Main. Я на самом деле решаю проблему с агрессивными коровами SPOJ. вот ссылка: https://www.spoj.com/problems/AGGRCOW/

public  int bs(int N,int C,int[] arr)
{   Arrays.sort(arr);
    int left = 0;int right = arr[N-1]-arr[0];int mid =  arr[N-1]-arr[0];
     int check = 0; int max= -1;
        while(left<right){  

            int temp= checker(mid,arr);
            if(temp>=C)
        {    if(max<mid)
              max=mid;
            left = mid+1;
            mid = (left+right)/2;  }
            else 
            {
                right= mid;
                mid=(left+right)/2;
            }

        }
   return max;

}
public  int checker(int mid,int[] arr)
{    int N = arr.length;int f=0;int cows=1;
    for(int i=0;i<N-1;i++)
    {
        if((arr[i+1]-arr[f])>=mid)
        {
            f=i+1;
            cows++;
        }
    }
    return cows;
}

}

1 Ответ

0 голосов
/ 27 января 2020

Обнаружил вашу проблему, это с заполнением исходного массива.

Я сам немного изменил ваш код, чтобы использовать Scanner и split (также удалил некоторый нерелевантный код), но проблема та же:

import java.util.Arrays;
import java.util.Scanner;
class Main
{
    public static void main (String[] args)
    {
        Scanner scan = new Scanner(System.in);
        int t =scan.nextInt(); scan.nextLine();

        for(int i = 0;i<t;i++)
        {
            String[] input = scan.nextLine().split(" ");
            int N = Integer.parseInt(input[0]);
            int C = Integer.parseInt(input[1]);

            int[] arr= new int[N];
            for(int x=0;x<N;x++){
                arr[i] = scan.nextInt();
                scan.nextLine();
            }

            int res=  bs(N,C,arr);
            System.out.println("RES = " + res);
        }

    }

    public static int bs(int N,int C,int[] arr) {
        Arrays.sort(arr);
        int left = 0;int right = arr[N-1]-arr[0];int mid =  arr[N-1]-arr[0];
        int max= -1;
        while(left<right){
            int temp= checker(mid,arr);
            if(temp>=C){
                if(max<mid)
                    max=mid;
                left = mid+1;
                mid = (left+right)/2;  }
            else {
                right= mid;
                mid=(left+right)/2;
            }
        }
        return max;
    }

    public static int checker(int mid,int[] arr){
        int f=0;int cows=1;
        for(int i=0;i<arr.length-1;i++) {
            if((arr[i+1]-arr[f])>=mid) {
                f=i+1;
                cows++;
            }
        }
        return cows;
    }
}

Ваша проблема заключается в следующем:

for(int x=0;x<N;x++){
                arr[i] = scan.nextInt();
                scan.nextLine();
            }

Значение i никогда не изменяется, поэтому все эти целые числа помещаются в один и тот же индекс вашего массива. Измените это на это:

for(int x=0;x<N;x++){
                arr[x] = scan.nextInt();
                scan.nextLine();
            }
...