Дано натуральное число x . Вы можете выполнить следующую операцию: выбрать положительное целое число k и округлить x до k -го разряда Обратите внимание, что числовые разряды нумеруются справа налево и начинаются с нуля. Если запись числа имеет k разрядов, то считается, что цифра на (k+1) -м разряде равна 0 . Округление происходит следующим образом: если цифра на (k−1) -м разряде больше или равна 5 , то цифра на k -м разряде увеличивается на 1 , иначе цифра на k -м разряде не меняется (используется математическое округление). если до выполнения операций цифра на k -м разряде равнялась 9 , и она должна увеличиться на 1 , то мы ищем наименьший такой разряд k′ (k′>k ), где цифра на k′ -м разряде меньше 9 и прибавляем 1 к цифре на k′ -м разряде. Затем мы присваиваем k=k′ . после этого все цифры, разряды которых меньше k , заменяются нулями. Ваша задача - сделать x максимально возможным, если вы можете выполнять операцию столько раз, сколько хотите. Например, если x равно 3451 , то если для первой операции выбрать: k=1 , то после операции x станет равным 3450 k=2 , то после операции x станет равным 3500 k=3 , то после операции x станет равным 4000 k=4 , то после операции x станет равным 0 Для максимизации ответа нужно сначала выбрать k=2 , а затем k=3 , тогда число станет равным 4000 . Входные данные Первая строка содержит одно целое число t (1≤t≤104 ) — количество наборов входных данных. В каждом наборе входных данных дано натуральное число x длиной до 2⋅105 , гарантируется, что в записи числа нет ведущих нулей. Гарантируется, что сумма длин чисел x по всем наборам входных данных не превышает 2⋅105 . Выходные данные Для каждого набора входных данных выведите максимально возможное значение x после операций. В записи числа не должно быть ведущих нулей.
Пример
входные данные
10
1
5
99
913
1980
20444
20445
60947
419860
40862016542130810467
выходные данные
1
10
100
1000
2000
20444
21000
100000
420000
41000000000000000000
Примечание
В первом примере лучше не выполнять никаких операций.
Примечание В первом примере лучше не выполнять никаких операций. Во втором примере вы можете выполнить одну операцию и получить 10 . В третьем примере можно выбрать k=1 или k=2 . В обоих случаях ответ будет 100 .
C/C++
Можете помочь с задачей на с++. Можете сказать хотя бы просто алгоритм решения.
Сохрани исходное число в виде набора цифр (в целочисленный тип конвертировать необязательно).
Пройди по числу с младших разрядов и последовательно округли его по алгоритму, описанному в задании, начиная с младшего разряда. Наибольшим числом будет одно из трёх:
Примерно так:
Пройди по числу с младших разрядов и последовательно округли его по алгоритму, описанному в задании, начиная с младшего разряда. Наибольшим числом будет одно из трёх:
- Исходное число (если во всех разрядах цифры от 0 до 4 включительно).
- Большее число с тем же количеством разрядов (если в старшем разряде цифра не более 4-х, и после округлений она останется не более 4-х). От последнего переноса и далее в нижние разряды все цифры будут нулями.
- Большее число с на единицу большим количеством разрядов, в старшем разряде 1 (если в старшем разряде была цифра между 5 и 9, включительно, или там было 4, которое по округлении превратилось в 5).
Примерно так:
#include
#include
using namespace std;
int main() {
unsigned short n;
cin >> n;
{
string s;
getline(cin, s);
}
while (n--) {
string s;
getline(cin, s);
string r(s.length(), '0');
r.reserve(s.length());
size_t cutoff = s.length();
unsigned char carry = 0;
for (size_t i = s.length(); i > 0; i--) {
const char c = s[i-1] + carry;
carry = c >= '5';
if (carry) cutoff = i;
else r[i-1] = c;
}
if (carry) {
cout
Если сделать тупенько - ну, организуй дерево перебора вариантов и адью. Там все равно все всегда в 0 упрется, число переборов не будет слишком большим.
Если делать по-умному - округляй всегда таким образом, чтобы после округления следующая циферка увеличилась и останавливайся, когда таких случаев больше нет. Все остальные способы ни на что не влияют.
Если делать по-умному - округляй всегда таким образом, чтобы после округления следующая циферка увеличилась и останавливайся, когда таких случаев больше нет. Все остальные способы ни на что не влияют.
Михаил Яценко
по-умному, я вообще не понимаю как делать, видимо поэтому на то оно и по-умному, вопрос по перебору, надо все варианты проверять, то есть округлять всё по очереди, или вообще как, не могли вы объяснить?
Михаил Яценко
пожалуйста
Вот код, который решает эту задачу:
#include
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
string x;
cin >> x;
int n = x.size();
int k = n;
for (int i = n - 2; i >= 0; i--) {
if (x[i] >= '5') {
k = i + 1;
while (k > 0 && x[k - 1] == '9') {
k--;
}
if (k == 0) {
cout
Похожие вопросы
- Скажите пожалуйста, как решать данную задачу на с++(хотя бы просто алгоритм действий)
- Можете помочь решить задачу по программированию.
- Можете подсказать по задаче или дать алгоритм задачи, код опять же не нужен
- Помогите решить задачу по программированию на C++
- СРОЧНО! Помогите с задачей.
- Решите задачу на любом языке, или хотя бы скажите идею как это вообще решать пожалуйста.
- ПОМОГИТЕ С ЗАДАЧЕЙ НА C++
- Помогите решить задачу по C++!
- Помогите решить задачу по программированию
- Помогите решить задачу пожалуйста, в C++