Форум Всеукраїнської інтернет-олімпіади NetOI


На форумі обговорюються лише питання, пов'язані з олімпіадою

Ви не зайшли.

#1 2020-11-08 12:14:06

LVV
Олімпієць
Звідки: Олешки
Зареєстрований: 2010-11-19
Повідомлень: 360
Вебсайт

Розв'язок задачі Divthree

Не чекаємо пів року, викладаємо свої розв'язки тут.

Код:

#include <iostream>;
#include <string>
using namespace std;
int main()
{
    string s;
    int sum=0;
    
    cin >> s;
    int n=s.length();

    //Знаходимо суму цифр і цифри
    int *M = new int[n];//числовий масив для зберігання цифр числа 
    for (int i=0; i<n; i++)
    {
        M[i]=char(s[i])-48;//зберігаємо цифру
        sum=sum+M[i];//знаходимо суму цифр
    }
    
//число ділиться на 3, якщо сума його цифр ділиться на 3
    //Визначаємо яке мінімальне значення можна додати до цифри, щоб число ділилось на 3
    int min_plus = 3 - sum % 3;
    
    //Визначаємо яке мінімальне значення можна відняти від цифри, щоб число ділилось на 3
    int min_minus = sum % 3;
    if (min_minus == 0) min_minus = 3;

    
    
    //якщо додаємо
    int max_plus;
    for (int i=0; i<n; i++)
    {
        //визначаємо скільки найбільше можна додати
            max_plus = 9-M[i];

        if (max_plus >= min_plus)//якщо до цифри можна додати хоть мінімальне min_plus
        {
            M[i]=M[i]+min_plus+(max_plus-min_plus)-(max_plus-min_plus)%3;
            for(int i=0; i<n; i++) cout << M[i];
            return 0;
        }
    }
//якщо віднімаємо
        M[n-1]=M[n-1]-min_minus;

//виводимо результат
            for(int i=0; i<n; i++) cout << M[i];
            
return 0;
}

Відредаговано LVV (2020-11-08 12:21:00)


Вік живи - вік навчайся.

Поза форумом

 

#2 2020-11-08 23:19:47

FordPerfect
Новий користувач
Зареєстрований: 2014-11-15
Повідомлень: 30

Re: Розв'язок задачі Divthree

Мой код:

Код:

#include <cstdio>
#include <cstring>

using std::scanf;
using std::strlen;
using std::fputs;

int main()
{
    char s[256],d;
    scanf("%s",s);
    int n=strlen(s),i,m=0;
    for(i=0;i<n;++i)
        m+=(s[i]-'0');
    for(i=0;i<n;++i)
        if((d="987"[('9'-s[i]+m)%3])>s[i])
            s[n=i]=d;
    if(i==n) s[n-1]="654"[('9'-s[n-1]+m)%3];
    fputs(s,stdout);
    return 0;
}

Кстати, раздельные темы также провоцируют

Повинно пройти, хоча б 60 секунд, між відправкою повідомлень. Будь ласка, спробуйте відправити наступне повідомлення трохи пізніше.

что, впрочем, мелочи.

Поза форумом

 

#3 2020-11-11 18:22:36

andervish
Новий користувач
Зареєстрований: 2011-01-16
Повідомлень: 25

Re: Розв'язок задачі Divthree

хоча б 60 секунд

Меня ни разу так не расстраивали, потому что слоупок.

А теперь код (python 2.7)

Код:

inp = map(int, raw_input())
rem = sum(inp) % 3

increased = False
for i in xrange(len(inp)):
    digit = inp[i]+(3-rem)
    if digit < 10:
        inp[i] = digit + (9-digit)/3*3
        increased = True
        break
    
if not increased:
    inp[-1] -= rem + 3*(not rem)
    
print ''.join(map(str,inp))

Відредаговано andervish (2020-11-11 18:23:36)

Поза форумом

 

Нижній колонтитул

Powered by Likt
© Copyright 2002–2009 Likt