Java program Algorytm

Java program Algorytm
D0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

ZADANIE

Rozważmy losowy ciąg liczb naturalnych C. Podaj długość oraz sumę elementów najdłuższego możliwego monotonicznego i spójnego zarazem podciągu ciągu C. W przypadku niejednoznaczności odpowiedzi wskaż pierwszy taki ciąg począwszy od lewej strony.

WEJŚCIE

Wiersz opisujący elementy ciągu C oddzielone znakiem odstępu (kod ASCII 32) zakończony znakiem końca pliku (EOF).

WYJŚCIE

Wiersz zawierający dwie liczby będące rozwiązaniem postawionego problemu oddzielone znakiem odstępu.

OGRANICZENIA

Długość ciągu C dodatnia i ograniczona przez 107, elementy rozważanego ciągu zawarte w przedziale wartości [0,109].

LIMITY

Oczekiwana złożoność czasowa rzędu O(n). Oczekiwana złożoność pamięciowa rzędu O(1).

PRZYKŁAD 1

wejście:

8 4 2 3 2

wyjście:

3 14

/* KOMENTARZ DO ROZWIĄZANIA

Poszukiwany podciąg monotonicznie malejący to: 8 4 2.

Długość i suma elementów wskazanego ciągu są równe odpowiednio 3 oraz 14. */

PRZYKŁAD 2

wejście:

1 1 7 3 2 0 0 4 5 5 6 2 1

wyjście:

6 20

PRZYKŁAD 3

wejście:

65 87 47 5 12 74 25 32 78 44 40 77 85 4 29 57 55 79 31 63 84 66 62 41 52 36 82 86 6 98 63 65 14 57 75 14 74 15 41 88 27 75 6 78 98 78 22 77 68 74 92 47 30 44 40 52 70 66 17 60 47 97 34 37 23 69 56 57 3 45 7 76 18 35 24 73 47 77 1 84 92 54 18 98 84 36 66 71 92 13 77 28 75 24 46 67 4 63 82 1

wyjście:

4 253

moj kod wyglada tak:

Kopiuj
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Monoto {
	public static void main(String[] args){

			
		ArrayList<Integer> listaRos = new ArrayList<Integer>();
		ArrayList<Integer> listaMa = new ArrayList<Integer>();
		ArrayList<Integer> listaRos2 = new ArrayList<Integer>();
		ArrayList<Integer> listaMa2 = new ArrayList<Integer>();
		ArrayList<Integer> lista = new ArrayList<Integer>();
		
		int sumaRos = 0;
		int sumaRos2 = 0;
		int sumaMa = 0;
		int sumaMa2 = 0;
		
		String input;
	    try {
	        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
	        input = bufferedReader.readLine();
	        Pattern pattern = Pattern.compile("[0-9]+");
	        Matcher matcher = pattern.matcher(input);
	        while(matcher.find()){
	        lista.add(Integer.parseInt(matcher.group()));
	        }
	        bufferedReader.close();
	    } catch (IOException e) {
	        e.printStackTrace();
	    }

		listaMa.add(lista.get(0));
		listaRos.add(lista.get(0));
		listaMa2.add(lista.get(0));
		listaRos2.add(lista.get(0));
		
		sumaMa2 =  lista.get(0);
		sumaMa =   lista.get(0);
		sumaRos2 = lista.get(0);
		sumaRos =  lista.get(0);
		
		
		for(int i=1;i<lista.size();i++){
			int liczba = lista.get(i);
		//Malejący
			if(liczba <= listaMa.get(listaMa.size()-1)){
				listaMa.add(liczba);
				sumaMa += liczba;
			}else{
				listaMa.removeAll(listaMa);
				listaMa.add(liczba);
				sumaMa = liczba;
			}
			if(listaMa.size() > listaMa2.size() || (listaMa.size() == listaMa2.size() && sumaMa > sumaMa2 )){
				listaMa2.removeAll(listaMa2);
				listaMa2.addAll(listaMa);
				sumaMa2 = sumaMa;
			}
		//Rosnący	
			
			if(liczba >= listaRos.get(listaRos.size()-1)){
				listaRos.add(liczba);
				sumaRos += liczba;
			}else{
				listaRos.removeAll(listaRos);
				listaRos.add(liczba);
				sumaRos = liczba;
			}
			if(listaRos.size() > listaRos2.size() || (listaRos.size() == listaRos2.size() && sumaRos > sumaRos2 )){
				listaRos2.removeAll(listaRos2);
				listaRos2.addAll(listaRos);
				sumaRos2 = sumaRos;
			}
		
		}
		if(listaRos2.size() > listaMa2.size()){
			System.out.println(listaRos2.size() + " " + sumaRos2);
		}
		if(listaRos2.size() < listaMa2.size()){
			System.out.println(listaMa2.size() + " " + sumaMa2);
		}
		if(listaRos2.size() == listaMa2.size()){
		  if(sumaMa2 >= sumaRos2){
			System.out.println(listaMa2.size() + " " + sumaMa2);
		  }
		  if(sumaMa2 < sumaRos2){
				System.out.println(listaRos2.size() + " " + sumaRos2);
			  }
		  }
	}
}
 

1 problem jest taki ze ten program jest zly a ja nie za bardzo wiem czemu
2 gdy rozwazamy ostatni przypadek program podaje mi wynik (4 265) a w przykladzie podaje 4 253
Mam prośbe o mała pomoc bo nie za bardzo wiem gdzie są błedy

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0
  1. Dodaj kontrolnie wypisywanie znalezionego ciągu
Kopiuj
        if(listaRos2.size() > listaMa2.size()){
            System.out.println(listaRos2.size() + " " + sumaRos2);
            System.out.println(listaRos2);
        }

analogicznie w pozostałych przypadkach.
2. Nie rozumiem tego fragmentu

Kopiuj
        if(listaRos2.size() == listaMa2.size()){
          if(sumaMa2 >= sumaRos2){
            System.out.println(listaMa2.size() + " " + sumaMa2);
          }
          if(sumaMa2 < sumaRos2){
                System.out.println(listaRos2.size() + " " + sumaRos2);
          }
        }

nie masz się kierować sumą, tylko położeniem znalezionego podciągu:

Kopiuj
        if(listaRos2.size() == listaMa2.size()){
          if(sumaMa2.get(0)<=sumaRos2.get(0)){
            System.out.println(listaMa2.size() + " " + sumaMa2);
          }
          if(sumaMa2.get(0)>=sumaRos2.get(0)){
                System.out.println(listaRos2.size() + " " + sumaRos2);
          }
        }
D0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Zmienilem algorytm na taki ale nadal wystepuja bledy wiecie moze jak go zooptymalizowac ??
Problem polega na tym ze przyklady dzialaja natomiast jak wrzucam na platforme spox to nie przechodzi pozytywnie testów.

Kopiuj
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Monoto {
	
	 
	
	
	
	public static void main(String[] args){

		 ArrayList<Integer> listaRos = new ArrayList<Integer>();
		 ArrayList<Integer> listaMa = new ArrayList<Integer>();
		 ArrayList<Integer> listaRos2 = new ArrayList<Integer>();
		 ArrayList<Integer> listaMa2 = new ArrayList<Integer>();
		 ArrayList<Integer> lista = new ArrayList<Integer>();
				
	     long suma = 0;
	     int indexMa;
	     int indexRos;
	     int indexMa2;
	     int indexRos2;
		
		String input;
	    try {
	        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
	        input = bufferedReader.readLine();
	        Pattern pattern = Pattern.compile("[0-9]+");
	        Matcher matcher = pattern.matcher(input);
	        while(matcher.find()){
	        lista.add(Integer.parseInt(matcher.group()));
	        }
	        bufferedReader.close();
	    } catch (IOException e) {
	        e.printStackTrace();
	    }

	    
	    
	    
		listaMa.add(lista.get(0));
		listaRos.add(lista.get(0));
		listaMa2.add(lista.get(0));
		listaRos2.add(lista.get(0));
		
		indexMa=0;
		indexRos=0;
		indexMa2=0;
		indexRos2=0;
		
		for(int i=1;i<lista.size();i++){
			int liczba = lista.get(i);
		//Malejący
			if(liczba <= listaMa.get(listaMa.size()-1)){
				listaMa.add(liczba);
			}else{
				listaMa.removeAll(listaMa);
				listaMa.add(liczba);
				indexMa = i;
			}
			if(listaMa.size() > listaMa2.size()){
				listaMa2.removeAll(listaMa2);
				listaMa2.addAll(listaMa);
				indexMa2 = indexMa;
			}
		//Rosnący	
			
			if(liczba >= listaRos.get(listaRos.size()-1)){
				listaRos.add(liczba);
			}else{
				listaRos.removeAll(listaRos);
				listaRos.add(liczba);
				indexRos = i;
			}
			if(listaRos.size() > listaRos2.size()){
				listaRos2.removeAll(listaRos2);
				listaRos2.addAll(listaRos);
				indexRos2 = indexRos;
			}
		
		}
		if(listaRos2.size() > listaMa2.size()){
			for(int j=0;j<listaRos2.size();j++){
				suma +=listaRos2.get(j);
			}
		System.out.println(listaRos2.size() + " " + suma);
		}else if(listaRos2.size() < listaMa2.size()){
			for(int j=0;j<listaMa2.size();j++){
				suma +=listaMa2.get(j);
			}
		System.out.println(listaMa2.size() + " " + suma);
		}else{
			if(indexMa2 < indexRos2){
			for(int j=0;j<listaMa2.size();j++){
				suma +=listaMa2.get(j);
				}
			System.out.println(listaMa2.size() + " " + suma);
			}else{
			for(int j=0;j<listaRos2.size();j++){
				suma += listaRos2.get(j);
			 }
			System.out.println(listaRos2.size() + " " + suma);
			}
		}
	}
}
 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.