» »

Izdelava algoritma

Izdelava algoritma

Klemen86 ::

Pozdravljeni!

Imam naslednjo težavo, in sicer bi rad izdelal algoritem, ki mi bo rešil naslednji problem:

X1 Y1 1 ... 1/2
X2 Y2 1 ... 2/2
X3 Y3 0 ... 0
X4 Y4 0 ... 0
X5 Y5 1 ... 1/3
X6 Y6 1 ... 2/3
X7 Y7 1 ... 3/3

Torej imam podatke o X in Y spremenljivkah in primerjam vrednosti obeh spremenljivk: X1 > Y1, zato je v tretjem stolpcu 1, medtem ko je X3 < Y3, zato je v tretjem stolpcu vrednost 0. Torej 1 označuje, da je X večji o Y in 0 ravno obratno.

Stanje, ki ga hočem dobiti v n stolpcu (odvisno od vmesnih korakov je naslednje) = seštevek vseh predhodnih 1 v nizu / maksimalno število 1 v nizu.

Hvala za kakršno koli pomoč.

lebdim ::

Iz česa izhajaš tukaj? Imaš te podatke zapisane v tekstovni datoteki?

Klemen86 ::

Podatke imam lahko v poljubnem formatu, lahko tudi v tekstovni datoteki.

Yacked2 ::

Kakšno je število vhodnih vrstic, da vem če je treba paziti na optimizacijo ali lahko nekaj na hitro spacam skupaj.
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

Yacked2 ::

import java.util.Scanner;

public class primer1
{

	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		
		//preberemo stevilo vhodnih parov
		int n = sc.nextInt();
		
		//tabela kamor shranjujemo vhodno podatke
		int[][] result = new int[n][5];
		
		//stejemo koliko zaporednih parov kjer je x vecji od y smo imeli zaporedoma
		int stevecVecjih = 0;
		
		//sprehodimo se po vhodnih podatkih
		for(int line = 0; line < n; line++)
		{
			//zacasna tabela kamor shranjujemo trenuten vhod
			int[] dump = new int[5];
			
			//preberemo nasledni par
			int x = sc.nextInt();
			int y = sc.nextInt();
			
			//shranimo v tabelo
			dump[0] = x;
			dump[1] = y;
			
			if(x > y)
			{
				//povecamo stevilo vecjih
				stevecVecjih++;
				dump[2] = 1;
				dump[3] = stevecVecjih;
				dump[4] = -1;
			}
			else
			{
				//prekinemo serijo vecjih
				dump[2] = 0;
				dump[3] = 0;
				dump[4] = 0;
				stevecVecjih = 0;
			}
			//shranimo v glavno tabelo
			result[line] = dump;
		}
		sc.close();
		
		//sprehodimo se cez celotno tabelo
		int i = 0;
		while (i < result.length)
		{
			//ce je x manjsi gremo takoj naprej
			if(result[i][2] == 0)
			{
				i++;
			}
			else
			{
				//x je vecji, poracunamo se zadnjo vrstico
				int stevec = 0;
				for(int j = i; j < result.length; j++)
				{
					//iscemo koliko zaporednih vhodov imamo kjer je x vecji od y
					if(result[j][2] == 1)
					{
						stevec++;
					}
					else
					{
						break;
					}
				}
				//vsem od i-tega do i+stevec-tega nastavimo zadnjo vrsto
				for(int j = i; j < i+stevec; j++)
				{
					result[j][4] = stevec;
				}
				//preskocimo ze poracunane
				i += stevec;
				
			}
		}
		
		//izpisemo output
		for(int a = 0; a < result.length; a++)
		{
			if(result[a][2] == 0)
			{
				System.out.println("0");
			}
			else
			{
				System.out.println(result[a][3] + "/" + result[a][4]);
			}
		}
	}	
}
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

stapler rump ::

Klemen86. nisi povedal, kaj se zgodi, ko sta X in Y enaka. Spodnje sicer izpiše tako tabelo, kot je v tvojem primeru iz podatkov v x in y seznamih:

x = [1, 1, 0, 0, 1, 1, 1]
y = [0, 0, 1, 1, 0, 0, 0]

from itertools import starmap, groupby

i = 1
for j, k in groupby(starmap(lambda i, j: i > j, zip(x, y))):
	k = list(k)
	for m, l in enumerate(k):
		if j:
			print("X%d Y%d 1 ... %d/%d" % (i, i, m+1, len(k)))
		else:
			print("X%d Y%d 0 ... 0" % (i, i))
		i += 1

Klemen86 ::

Hvala za hitro pomoč. Mi je uspelo rešit. Če je X = Y, je vrednost 0.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Naloga iz Putka - UPM

Oddelek: Programiranje
241708 (1044) NejcSSD
»

java pomoč

Oddelek: Programiranje
211557 (949) kr?en
»

BMI kalkulator

Oddelek: Programiranje
9917 (743) jype
»

Java - dva problema

Oddelek: Programiranje
141460 (1068) nightrage
»

[Java] Kako filtrirati, katera števila lahko vpišeš?

Oddelek: Programiranje
181731 (1433) fiction

Več podobnih tem