View Single Post
Old 17-08-2008, 09:47   #39
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Comunque alla fine ho tradotto in Python l'idea che avevo, ma sembra dannatamente lenta...
In fondo era solo un metodo "velocizzato" per analizzare tutti i possibili sottoquadrati, ma l'ho lanciato oltre venti minuti fa ed è ancora lì che gira, quindi non so se vale la pena di tradurlo anche in C: dubito di riuscire anche lontanamente a raggiungere gugoXX, pure su un computer serio.
Magari dopo provo a farlo lo stesso e vediamo che schifezza ne esce fuori.

ciao

EDIT: come non detto, ha appena finito...
Ci ha messo appena 35 minuti.
Codice:
Lettura completata in 2500.54476273 millisecondi.
Caricata una matrice 200x200.
Inizio la ricerca... completata in 2115368.25458 millisecondi.

Risultato: posizione (94, 60) larghezza 56 somma 3185
Il codice è il seguente:
Codice:
from time import clock

def read(filename):
	f = open(filename)

	list = []
	first = f.readline()
	side = int(first[2 : len(first)-3])
	for line in f:
		tmp = []
		for w in line.split():
			tmp.append(int(w))
		list.append(tmp)
	f.close()
	return side, list

def sumrange(a, x1, y1, x2, y2):
	s = 0
	for y in xrange(y1, y2):
		for x in xrange(x1, x2):
			s += a[y][x]
	return s

def contest5b(w, a):
	max_side = 1
	max_coord = (0, 0)
	max_sum = 0

	side = 1
	while side <= w:
		x = 0
		while (x + side) <= w:
			tmp = sumrange(a, x, 0, x + side, side)

			if (tmp > max_sum):
				max_coord = (x, 0)
				max_side = side
				max_sum = tmp

			y = 0
			while (y + side) < w:
				for i in xrange(side):
					tmp += (a[y+side][x+i] - a[y][x+i])

				if (tmp > max_sum):
					max_coord = (x, y+1)
					max_side = side
					max_sum = tmp
				y += 1
			x += 1
		side += 1
	return max_coord, max_side, max_sum

t1 = clock()
w, a = read("Matrix2.txt")
t2 = clock()
print "Lettura completata in", (t2-t1)*1000.0, "millisecondi."

print "Caricata una matrice %dx%d." % (w, w)
print "Inizio la ricerca...",
t1 = clock()
coord, side, sum = contest5b(w, a)
t2 = clock()
print "completata in", (t2-t1)*1000.0, "millisecondi."
print
print "Risultato: posizione", coord, "larghezza", side, "somma", sum
Considerando che il mio Contest 4 in Python ci ha messo 13 minuti sulla mia macchina e 38 secondi su quella di grigor91, questo mio Contest 5B dovrebbe impiegare sulla sua macchina la bellezza di 1 minuto e 42 secondi. Considerando anche che il Contest 4 tradotto in C sono riuscito a farlo scendere a 4 minuti su questo catorcio, sul PC di grigor91 il Contest 5B dovrebbe arrivare intorno a... 30 secondi.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 17-08-2008 alle 14:03.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso