Никита К.
1594 сообщения
#14 лет назад
Есть следующий алгоритм:
Пускай f(n,m) — минимальное число цветов для n плиток, если максимальный размер квадрата равен m.
f(n,m)=
m=1: n
n<m*m: f(n,m-1)
иначе: min(f(n,m-1),f(n-m*m,m)+1)
Найти f(N,(int)sqrt(N)).


Для N = 30000 решение ищется полвечности. Хочется как то преобразовать алгоритм. Может кто нибудь помочь с этим? У меня всегда было туго с оптимизацией
Никита К.
1594 сообщения
#14 лет назад
for(i = 0; i <= n; i++){a=i;}

for(m = 2; m*m <= n; m++)
{
for(i = m*m; i <= n; i++){
a = min(a + 1, a);
}
}


Попытался привести к такому виду. Не работает((
Кирилл Е.
2817 сообщений
#14 лет назад
Похоже на лаб.работу ..

..условие цветной плитки - две с одинаковым цветом не должны соприкасаться (кроме как углами)? - это очень важно.
Никита К.
1594 сообщения
#14 лет назад
kirilev, не, не лаба. Олимпиадная задача.Решаю "для себя")

Целиком текст?
В магазине продаются квадратные плитки различных цветов. Пете нужно купить N плиток и сложить из них мозаику, в которой плитки одного цвета образуют квадрат и ни в какой другой квадрат не входят. Таким образом, из N плиток должно получиться какое-то количество квадратов различных цветов. Например, из 10 плиток можно сложить два квадрата со сторонами 3 и 1, или четыре квадрата  со сторонами 2, 2, 1, 1. Петя задумался — какое минимальное количество цветов при этом можно использовать. Помогите ему это определить.

Входные данные: Во входном файле записано одно число N (1 ≤ N ≤ 30000).
Выходные данные: Выходной файл должен содержать единственное целое число — минимальное количество различных цветов.

Примеры:
input.txt output.txt
10 2
3 3
18 2
Никита К.
1594 сообщения
#14 лет назад
Цитата ("kirilev"):
Похоже на лаб.работу ..

Лабы я за выходные сделал
Арам Шатахцян
1 сообщение
#14 лет назад

#include <iostream>
using namespace std;
int ans;
int main()
{
int n, i, j, t;
cin>>n;
ans = 0;
for(i=1; i<=n; i++)
{
ans = i;
for(j=1; j*j<=i; j++)
{
t = ans+1;
if(t < ans) ans = t;
}
}
cout<<ans<<endl;
return 0;
}
Кирилл Е.
2817 сообщений
#14 лет назад
Оффтопик
Цитата ("Anexroid"):
kirilev, не, не лаба. Олимпиадная задача.Решаю "для себя"

Слабенькая задачка как для олимпиадной... но интересная .. у нас лабы разные такие были..


Цитата ("Anexroid"):
Лабы я за выходные сделал

Молодец!
Никита К.
1594 сообщения
#14 лет назад
Эх, пока ждал ответа, уже сделал))

int f(int n)
{
int i, m;
int a;

for(i = 0; i <= n; ++i){ a=i; }

for(m = 2; m * m <= n; ++m){
for(i = m * m; i <= n; ++i){
a = min(a + 1, a);
}
}
return a;

}
Автор Е.
277 сообщений
#14 лет назад
Оффтопик
Цитата ("Anexroid"):
Петя задумался

представляю этого Петю, который перед кассой задумался, и в голове решает факториалы ))))с дифференциалами ))))
Никита К.
1594 сообщения
#14 лет назад
avtorkoda, а меня всегда удивляли такие задачи.
Ну какой мудак в такие моменты будет что то вычислять? =)