Skip to content

Instantly share code, notes, and snippets.

@egv
Last active October 19, 2024 15:35
Show Gist options
  • Save egv/425969bed5741a4e7beb854390ff4b4e to your computer and use it in GitHub Desktop.
Save egv/425969bed5741a4e7beb854390ff4b4e to your computer and use it in GitHub Desktop.
/*
В 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