Last active
October 19, 2024 15:35
-
-
Save egv/425969bed5741a4e7beb854390ff4b4e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
В 1941 году Национальная галерея искусства в Вашингтоне получила беспрецедентный дар — коллекцию | |
Эндрю Меллона, состоящую из картин Рафаэля, Тициана и Рембрандта, должна была стать ядром нового | |
музея. Однако здание галереи еще строилось, и кураторам пришлось решать сложную задачу: как | |
разместить все эти шедевры в ограниченном пространстве, не повредив их и обеспечив доступ для изучения | |
и реставрации. Ваша задача — найти минимальное количество стен, на которых можно разместить | |
коллекцию Меллона. Стена представляет собой прямоугольник 10×4. Имеются восемь типов экспонатов размерами: | |
1×1, 1×2, 1×3, 1×4, 2×2, 2×3, 2×4, 3×3. | |
Картины нельзя переворачивать! | |
*/ | |
import Foundation | |
func minWalls(_ counts: [Int]) -> Int { | |
// Количество стен | |
var walls = 1 | |
// Количество экспонатов для каждого типа | |
var x1 = counts[0] // 1x1 | |
var x2 = counts[1] // 1x2 | |
var x3 = counts[2] // 1x3 | |
var x4 = counts[3] // 1x4 | |
var x5 = counts[4] // 2x2 | |
var x6 = counts[5] // 2x3 | |
var x7 = counts[6] // 2x4 | |
var x8 = counts[7] // 3x3 | |
// processing wall | |
while x1+x2+x3+x4+x5+x6+x7+x8 > 0 { | |
var wall = [4,4,4,4,4,4,4,4,4,4] | |
var prevFree = 40 | |
var wallDone = false | |
while (!wallDone) { | |
var line = 0 | |
while line < 10 { | |
var pWall = 0 | |
while(wall[line] > 0 && pWall != wall[line]) { | |
let freeTiles = wall[0] + wall[1] + wall[2] + wall[3] + wall[4] + wall[5] + wall[6] + wall[7] + wall[8] + wall[9] | |
print("\(walls)\t\(wall)\t\(freeTiles)\t\(x1)\t\(x2)\t\(x3)\t\(x4)\t\(x5)\t\(x6)\t\(x7)\t\(x8)") | |
pWall = wall[line] | |
if line < wall.count - 2 { // 3x3, 2x3, 1x3 | |
while ((x8 > 0) && (wall[line] >= 3) && (wall[line+1] >= 3) && (wall[line+2] >= 3)) { // we have 3x3 and a place for it | |
x8-=1; | |
wall[line]-=3; | |
wall[line+1]-=3; | |
wall[line+2]-=3; | |
} | |
while (x6 > 0 && (wall[line] >= 2) && (wall[line+1] >= 2) && (wall[line+2] >= 2)) { // we have 2x3 and a place for it | |
x6-=1; | |
wall[line]-=2; | |
wall[line+1]-=2; | |
wall[line+2]-=2; | |
} | |
while (x3 > 0 && (wall[line] >= 1) && (wall[line+1] >= 1) && (wall[line+2] >= 1)) { // we have 2x3 and a place for it | |
x3-=1; | |
wall[line]-=1; | |
wall[line+1]-=1; | |
wall[line+2]-=1; | |
} | |
} | |
if line < (wall.count - 3) { // 2x4, 1x4 | |
while (x7 > 0 && (wall[line] >= 2) && (wall[line+1] >= 2) && (wall[line+2] >= 2) && (wall[line+3] >= 2) ){ // got 2x4 | |
x7-=1; | |
wall[line]-=2; | |
wall[line+1]-=2; | |
wall[line+2]-=2; | |
wall[line+3]-=2; | |
} | |
while (x4 > 0 && (wall[line] >= 1) && (wall[line+1] >= 1) && (wall[line+2] >= 1) && (wall[line+3] >= 1) ){ // got 2x4 | |
x4-=1; | |
wall[line]-=1; | |
wall[line+1]-=1; | |
wall[line+2]-=1; | |
wall[line+3]-=1; | |
} | |
} | |
if line < wall.count - 1 { // 2x2, 1x2 | |
while ((x5 > 0) && (wall[line] >= 2) && (wall[line+1] >= 2)) { // we have 2x2 and a place for it | |
x5-=1; | |
wall[line]-=2; | |
wall[line+1]-=2; | |
} | |
while (x2 > 0 && (wall[line] >= 1) && (wall[line+1] >= 1)) { // we have 2x3 and a place for it | |
x2-=1; | |
wall[line]-=1; | |
wall[line+1]-=1; | |
} | |
} | |
if (line < wall.count) { | |
while ((x1 > 0) && (wall[line] >= 1)) { // we have 1x1 and a place for it | |
x1-=1; | |
wall[line]-=1; | |
} | |
} | |
} | |
line+=1 | |
} | |
let freeTiles = wall[0] + wall[1] + wall[2] + wall[3] + wall[4] + wall[5] + wall[6] + wall[7] + wall[8] + wall[9] | |
// print("free tiles: \(freeTiles), walls: \(walls), walls: \(wall) pictures: \(x1) \(x2) \(x3) \(x4) \(x5) \(x6) \(x7) \(x8)") | |
if x1+x2+x3+x4+x5+x6+x7+x8 == 0 { | |
wallDone = true | |
} else if ( freeTiles == 0 || freeTiles == prevFree) { | |
wallDone = true; | |
walls+=1 | |
} else { | |
prevFree = freeTiles | |
} | |
} | |
} | |
return walls | |
} | |
// Чтение входных данных | |
if let input = readLine() { | |
let counts = input.split(separator: " ").map { Int($0)! } | |
let result = minWalls(counts) | |
print(result) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment