0votos

Revival Party en SQL

por josejuan hace 6 años

Por varias un poco la solución es con SQL, para no morir de aburrimiento (ya que es una fiesta) me he olvidado del backtraking ignorando la condición de que el tiempo total se ajuste lo más posible al tiempo de la fiesta. En lo demás cumple.

Se trata de un práctica que hice en clase. La verdad es que me llevo unas cuantas horas hacerla. Quizá el enunciado es más largo de lo que se acostumbra a ver por aquí, pero vale la pena hacerla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* 
    Lista de canciones disponibles en: 
 
    TABLE @songs( 
        k    el id 
        d    la década 
        t    el tiempo 
 
    @partyTime    duración de la fiesta 
 
    ------------ 
    NOTAS 
    * ¡El código no está probado! 
    * ¡Cumple todo excepto el ajuste óptimo al tiempo de la fiesta! 
    * Microsoft SQL Server 
*/ 
 
DECLARE @t70 TABLE (o int identity(1,3), k int, t int) 
DECLARE @t80 TABLE (o int identity(2,3), k int, t int) 
DECLARE @t90 TABLE (o int identity(3,3), k int, t int) 
DECLARE @lst TABLE (o int, k int, t int, a int) 
 
INSERT INTO @t70(k) SELECT k, t FROM @songs WHERE d = 70 ORDER BY t DESC 
INSERT INTO @t80(k) SELECT k, t FROM @songs WHERE d = 80 ORDER BY t DESC 
INSERT INTO @t90(k) SELECT k, t FROM @songs WHERE d = 90 ORDER BY t DESC 
 
DECLARE @a int 
DECLARE @b int 
 
SELECT @a = MAX(o) FROM @t70 
SELECT @b = MAX(o) FROM @t80 
IF @b < @a SET @a = @b 
SELECT @b = MAX(o) FROM @t90 
IF @b < @a SET @a = @b 
 
INSERT INTO @lst(o, k, t) 
SELECT i, k, t FROM @t70 UNION 
SELECT i, k, t FROM @t80 UNION 
SELECT i, k, t FROM @t90 
 
DELETE FROM @lst WHERE o >= @a + 3 
 
IF (SELECT SUM(t) FROM @lst) < @partyTime 
    PRINT "NOSOLUTION" 
ELSE 
BEGIN 
    UPDATE @lst SET a = (SELECT SUM(t) FROM @lst WHERE o <= u.o) FROM @lst u 
    SELECT k FROM @lst WHERE a <= @partyTime ORDER BY o 
END 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.