То, что раньше встречалось только у неубиваемых CAT S60 и представителей линейки Samsung Galaxy S, постепенно доходит и до других, более доступных категорий устройств. Олеофобное покрытие, рейтинг IP68 и другие характеристики часто используются в описании продуктов. Но что это все значит? Давайте разбираться.
Дисплей
Защитное стекло для смартфонов и планшетов существует уже несколько лет. В зависимости от производителя на устройстве может стоять ионно-усиленное стекло или брендовое Corning Gorilla Glass. Apple использует свое собственное стекло, которое, хотя и обеспечивает некоторую защиту, все равно не экран от повреждений после падения с небольшой высоты на твердый пол.
Последнее решение для защиты экрана - это Gorilla Glass 5. По утверждениям компании Corning, оно выдерживает падение с 6 футов на твердую поверхность в 80% случаев.
Часто можно встретить такую характеристику, как олеофобное покрытие. Оно не является защитой от физических повреждений, а лишь дает некоторые преимущества, в частности, устойчивость к появлению на экране жирных пятен. На самом деле, оно не полностью избавляет от отпечатков пальцев: с олеофобным покрытием их просто легче стереть с дисплея. Покрытие изнашивается за пару лет, однако его можно нанести повторно.
IP-защита
В описании большинства смартфонов из средней и высокой ценовой категории можно встретить значение IP67 или IP68. К сожалению, эти цифры часто появляются без объяснения того, что они означают. IP - это «ingress protection», защита, препятствующая проникновению пыли и воды внутрь корпуса. Каждая цифра указывает на защиту от определенного элемента. Первая может иметь значение от 1 до 6, она показывает, насколько хорошо устройство защищено от твердых частиц (пыли и грязи). Значение второй цифры варьируется от 1 до 8. Это защита от влаги.
Рейтинг пылезащиты менее 6 встречается редко. Это означает, что каждый флагманский смартфон можно без проблем использовать хоть в пыльную бурю. Что касается влагозащиты, разница в один может показаться не существенной, однако на практике различие есть, причем довольно большое.
Если смартфон защищен от попадания воды по седьмому уровню (то есть, IP67), он выдержит погружение на глубину до 3 футов и сможет провести там, сохраняя работо , как минимум 30 минут. Если рейтинг защиты от влаги равен 8 (IP68), допустимая глубина погружения составляет 6 футов. Давление воды при этом увеличивается в 2 раза. Разница в давлении может критически повлиять на то, проникнет вода через микроотверстия внутри корпуса или нет.
Следует отметить, что даже если смартфон обладает защитой IP68, это не значит, что он является полностью водонепроницаемым. На самом деле, рейтинг отображает не сам факт проникновения воды, а произойдут ли вследствие погружения какие-нибудь поломки. На практике смартфон с IP67/68 можно использовать под дождем, и с ним ничего не случится. Но если уронить его в ванну, он скорее всего выживет - скорее всего, но не точно.
Рассмотрим следующую задачу. В обороте находятся банкноты k различных номиналов: a1, a2, ..., ak рублей. Банкомат должен выдать сумму в N рублей при минимального количества банкнот или сообщить, что запрашиваемую сумму выдать нельзя. Будем считать, что запасы банкнот каждого номинала неограничены.
Рассмотрим такой алгоритм: будем выдавать банкноты наибольшего номинала, пока это возможно, затем переходим к следующему номиналу. Например, если имеются банкноты в 10, 50, 100, 500, 1000 рублей, то при N = 740 рублей такой алгоритм выдаст банкноты в 500, 100, 100, 10, 10, 10, 10 рублей. Подобные алгоритмы называют «жадными», поскольку каждый раз при принятии решения выбирается тот вариант, который кажется наилучшим в данной ситуации (чтобы использовать наименьшее число банкнот каждый раз выбирается наибольшая из возможных банкнот).
Но для решения данной задачи в общем случае жадный алгоритм оказывается неприменимым. Например, если есть банкноты номиналом в 10, 60 и 100 рублей, то при N = 120 жадный алгоритм выдаст три банкноты: 100 + 10 + 10, хотя есть использующий две банкноты: 60 + 60. А если номиналов банкнот только два: 60 и 100 рублей, то жадный алгоритм вообще не сможет найти решения.
Но эту задачу можно решить при метода динамического программирования. Пусть F(n) -- минимальное количество банкнот, которым можно заплатить сумму в n рублей. Очевидно, что F(0) = 0, F(a1) = F(a2) =...= F(ak) = 1. Если некоторую сумму n невозможно выдать, будем считать, что F(n) = $ \infty$ (бесконечность).
Выведем рекуррентную формулу для F(n), считая, что значения F(0), F(1), ..., F(n - 1) уже вычислены. Как можно выдать сумму n? Мы можем выдать сумму n - a1, а потом добавить одну банкноту номиналом a1. Тогда нам понадобится F(n - a1) + 1 банкнота. Можем выдать сумму n - a2 и добавить одну банкноту номиналом a2, для такого понадобится F(n - a2) + 1 банкнота и т. д. Из всевозможных выберем наилучший, то есть:
F(n) = min(F(n - a1), F(n - a2),..., F(n - ak)) + 1.
Теперь заведем массив F[n+1], который будем последовательно заполнять значениями выписанного рекуррентного соотношения. Будем предполагать, что количество номиналов банкнот хранится в переменной int k, а сами номиналы хранятся в массиве int a[k].
const int INF=1000000000; // Значение константы }бесконечность}
int F[n+1];
F[0]=0;
int m, i;
for(m=1; m<=n; ++m) // заполняем массив F
{ // m - сумма, которую нужно выдать
F[m]=INF; // помечаем, что сумму m выдать нельзя
for(i=0; i<k; ++i) // перебираем все номиналы банкнот
{
if(m>=a[i] && F[m-a[i]]+1<F[m])
F[m] = F[m-a[i]]+1; // изменяем значение F[m], если нашли
} // лучший выдать сумму m
}
После окончания этого алгоритма в элементе F[n] будет храниться минимальное количество банкнот, необходимых, чтобы выдать сумму n. Как теперь вывести представление суммы n при банкнот? Опять рассмотрим все номиналы банкнот и значения n - a1, n - a2, ..., n - ak. Если для какого-то i окажется, что F(n - ai) = F(n) - 1, значит, мы можем выдать банкноту в ai рублей и после этого свести задачу к выдаче суммы n - ai, и так будем продолжать этот процесс, пока величина выдаваемой суммы не станет равна 0:
if (F[n]==INF)
cout<<"Требуемую сумму выдать невозможно"<<endl;
else
while(n>0)
for(i=0;i<k;++i)
if (F[n-a[i]]==F[n]-1)
{
cout<<a[i]<<" ";
n-=a[i];
break;
}
не удаляйте это