Разбор и решение задач по программированию

5 - 6 класс

 

Задача 1. 

Ваня захотел играть в Minecraft.

Для регистрации аккаунта ему нужно придумать пароль. Он взял число N - свою дату рождения, и удалил вторую цифру справа. И получил пароль. Зная его дату рождения, вычислите его пароль.

Примечание: никогда не используйте дату рождения в качестве пароля!

Формат ввода

Вводится натуральное число N, не превосходящее 100000.

Формат вывода

Выведите ответ на задачу.

Пример

Ввод                            Вывод

12345                           1235

 

Решение:

С помощью целочисленного деления числа n на 100 «вырезаем» первые три цифры. Умножаем полученное число на 10 чтобы в конце образовался 0. Теперь находим последнюю цифру числа n. Для этого находим остаток от деления числа n на 10. Складываем наш первый результат со вторым и получаем пароль Вани.

 

var n:integer;

begin

  read(n);

  write(n div 100*10+n mod 10);

end.

 

Задача 2.

Ваня создал новый мир. Ему нужно добыть доски для дома. Недалеко от себя он увидел четыре дерева. Но так как он хочет сэкономить время, ему нужно добежать до ближайшего дерева. Вы знаете расстояния до каждого дерева в блоках. Помогите Ване определить, к какому дереву бежать.

Формат ввода

В одной строке через пробел вводятся четыре натуральных числа, не превосходящих 100000. Все числа разные.

Формат вывода

Выведите номер ближайшего дерева.

Пример

Ввод                                    Вывод

5 8 9 6                                   1

 

Решение:

Условие задачи можно привести к такому виду: даны 4 числа, найти минимальное.

Так как чисел всего 4, то мы можем просто их сравить друг с другом.

 

var a,b,c,d:integer;

begin

  read(a,b,c,d);

  if (a<b) and (a<c) and (a<d) then writeln (1)

  else if (b<c) and (b<d) then writeln (2)

    else if c<d then writeln (3)

      else writeln (4);

end.

 

Задача 3. 

Ваня хочет построить дом.  Он нашел идеальное место. Однако ему мешает гора. Ваня взял алмазную кирку и пошел на вершину горы. Гора составлена из блоков камня, сложенных слоями друг на друге. На вершине горы 1 блок. На слое ниже – 9 блоков, еще ниже – 25 блоков, затем 49 и так далее. Зная количество слоев горы, помогите Ване узнать, сколько блоков ему необходимо сломать, чтобы освободить место для дома.

Формат ввода

Вводится натуральное число N, не превосходящее 100, – количество слоев горы.

Формат вывода

Выведите ответ на задачу.

Пример

Ввод

2

Вывод

10

 

Решение:

Первое, что нужно сделать при решении данной задачи – это найти последовательность среди чисел 1, 9, 25, 49 и так далее. Числа данной последовательности являются квадратами чисел с шагом 2. То есть, 1*1, 3*3, 5*5, 7*7, 9*9, 11*11 и так далее. Нам требуется найти сумму n чисел данной последовательности. Для этого открываем цикл от 1 до n. В новую переменную s прибавляем x возведенное в квадрат, далее к x прибавляем 2 и повторяем данные шаги n раз.

P/s: Не забываем прировнять 1 к переменной x перед циклом, так как при умножении на 0 получится 0.

 

var n,s,x,i:integer;

begin

  read(n);

  s:=0;

  x:=1;

  for i:=1 to n do

  begin

    s:=s+x*x;

    x:=x+2;

  end;

  writeln(s);

end.

 

Задача 4.

Ване надоело играть одному. И он стал играть с друзьями. Ваня накопал много алмазов. Для всех друзей он решил сделать по одной алмазной кирки в качестве подарка. У Вани есть n алмазов и k блоков дуба. Из одного блока дуба можно сделать 4 доски. А из 2 досок можно сделать 4 палки. Для создания алмазной кирки ему нужно 3 алмаза и 2 палки. Помогите подсчитать, сколько друзей обрадуется его подарку.

Формат ввода

В одной строке через пробел вводятся два натуральных числа n и k, не превосходящих 100000.

Формат вывода

Выведите ответ на задачу.

Пример

Ввод                                                                Вывод                                  

7 2                                                                      2

Примечание

Из двух блоков дуба получится 8 досок, а из них 16 палок. Их хватит на 8 алмазных кирок. Но семь алмазов хватит только на две алмазные кирки.

 

Решение:

1) Сначала посчитаем, сколько мы можем сделать палок для кирки из k блоков дуба. По условию умножаем k на 4 (1 блок = 4 доски) и на 2 (2 доски = 4 палки или 1 доска = 2 палки).

2) Посчитаем, сколько кирок мы можем сделать из k палок. Находим частное от деления k на 2 (2 палки = 1 кирка).

3) Теперь посчитаем, сколько кирок мы можем сделать из n алмазов. Находим частное от деления n на 3 (3 алмаза = 1 кирка).

4) Осталось определить, сколько кирок в итоге мы можем получить. Сравниваем результаты из двух предыдущих пунктов.

 

var n,k,a,b:integer;

begin

  read(n,k);

  k:=k*4*2;

  a:=n div 3;

  b:=k div 2;

  if a<=b then write(a)

  else write(b);

end.

 

Задача 5. 

Ваня стал администратором сервера. И на его сервере играет много игроков. Ваня – добрый человек, поэтому он следит за всеми сообщениями, которые пишут игроки. В сообщениях игроки используют смайлики. Весёлый смайлик – это символы двоеточие и закрывающаяся скобка рядом без пробела :)  Грустный смайлик – двоеточие и открывающаяся скобка без пробела :( Сообщение является весёлым, если весёлых смайликов больше, чем грустных. А если сообщение грустное, то Ваня блокирует доступ к чату этому игроку. Дано сообщение. Определите, сколько весёлых смайликов нужно добавить, чтобы Ваня не заблокировал игрока в чате.

Формат ввода

Вводится строка, состоящая из латинских букв, пробелов, символов двоеточие и круглых скобок, не превосходящая 255 символов.

Формат вывода

Выведите ответ на задачу.

Пример 1

Ввод                                                                     Вывод

I won :)                                                                 0

Пример 2

Ввод                                                                      Вывод

you are great :) and I lost:(                          1

Примечание

В первом примере ничего добавлять не надо, так как оно уже весёлое. Во втором примере необходимо добавить один весёлый смайлик.

 

Решение:

Всё, что нам нужно найти в данной задаче – это количество рядом стоящих символов :) и :( Почему именно рядом стоящих? По условию сказано, что веселым или грустным смайликами считаются именно те, которые состоят из символа двоеточия и скобки.

1) Открываем цикл от 1 до длины строки минус 1

2) Вырезаем по 2 символа (именно поэтому открываем цикл до предпоследнего элемента, а не до последнего) из строки и сравниваем с символами ‘:)’ и ‘:(’

Если символы совпали, то считаем количество, прибавляет к новым переменным a или b единицу.

3) Сравниваем количество веселых и грустных смайликов. Если веселых больше, то печатаем 0, иначе печатаем разность чисел b и a плюс 1.

 

var s:string;i,a,b:integer;

 begin

   readln(s);

   a:=0;

   b:=0;

   for i:=1 to length(s)-1 do

   begin

     if copy(s,i,2)=':)' then inc(a);

     if copy(s,i,2)=':(' then inc(b);

   end;

   if a>b then writeln(0)

   else writeln(b-a+1);

 end.

7 - 8 класс

 

Задача 1. 

Компьютер состоит из процессорного блока и монитора. На складе имеется N системных блоков и M мониторов. i-й блок стоит Ai тенге,  j-й монитор -  Bj тенге. Стоимость компьютера, в состав которого входит  i-й системный блок и  j-й монитор равна - Ai* Bj (умножение) тенге. Для дистанционного обучения школьников необходимо собрать наибольшее возможное количество компьютеров так, чтобы их суммарная стоимость была максимально возможной.

Формат ввода

В первой строке вводятся два натуральных числа N и M, не превосходящие 1000.

Во второй строке вводятся N чисел:  i-е число в строке - это Ai.   

Третья строка содержит M чисел:  j -е число в строке - это Bj.

Ai, Bj не превосходят 1000.

Формат вывода

Выведите 2 целых числа, разделенных пробелом - максимально возможное число компьютеров и их максимальную суммарную стоимость.

Пример

Ввод                                                       Вывод

3 2                                                             2 23

1 2 3

4 5

Решение:

#include<bits/stdc++.h>

using namespace std;

int main(){

            int n,m;

            cin>>n>>m;

            int a[n],b[m];

            for(int i=0;i<n;i++)cin>>a[i];

            for(int i=0;i<m;i++)cin>>b[i];

            sort(a,a+n);

            sort(b,b+m);

            int s=0,k=0;

            while(n*m>0){

                        s+=a[n-1]*b[m-1];

                        n--;m--;k++;

            }

            cout<<k<<" "<<s;

            return 0;

}

Задача 2.

Выполняя задание по  суммативному оцениванию Аружан, Алим и Арина получили разный результат. Чтобы выбрать правильное решение, стали выяснять, кто же из них самый умный? Для этого сравнили свои дни рождения и определили старшего. Кто старше, тот и умнее!

Формат ввода

Вводится список дат.

Формат вывода

Выведите номер старшего из списка.

Пример                                      

Ввод                                                      Вывод

3.03.2007                                            3

25.10.2008

2.03.2007

Решение:

d1,m1,y1 = map(int,input().split('.'))
d2,m2,y2 = map(int,input().split('.'))
d3,m3,y3 = map(int,input().split('.'))
if (y1<y2 and y1<y3):
    print(1)
elif (y2<y1 and y2<y3):
    print(2)
elif (y3<y1 and y3<y2):
    print(3)
elif (y1==y2 and y1<y3):
    if (m1<m2):
        print(1)
    elif (m2<m1):
        print(2)
    elif (d1<d2):
        print(1)
    else: print(2)
elif (y3==y2 and y3<y1):
    if (m3<m2):
        print(3)
    elif (m2<m3):
        print(2)
    elif (d3<d2):
        print(3)
    else: print(2)    
elif (y3==y1 and y3<y2):
    if (m3<m1):
        print(3)
    elif (m1<m3):
        print(1)
    elif (d3<d1):
        print(3)
    else: print(1)
elif (m1<m2 and m1<m3):
    print(1)
elif (m2<m1 and m2<m3):
    print(2)
elif (m3<m1 and m3<m2):
    print(3)
elif (m1==m2 and m1<m3):
    if (d1<d2):
        print(1)
    else: print(2)
elif (m1==m3 and m1<m2):
    if (d1<d3):
        print(1)
    else: print(3)    
elif (m2==m3 and m2<m1):
    if (d2<d3):
        print(2)
    else: print(3)
elif (d1<d2 and d1<d3):
    print(1)
elif (d2<d3):
    print(2)
else: print(3)

Задача 3. 

 

Александр, увидев, что сегодня не предполагается работа в ZOOM, решил устроить себе отдых и  сходить в хороший кинотеатр. Каждый кинотеатр в городе, характеризуется   двумя числами К и L, где

К -  количество рядов, a L - количество мест в каждом ряду. Опасаясь короновируса, Александр решил сесть точно по центру зала. Определите, сможет ли Александр выбрать этот кинотеатр или нет.,

Формат ввода

Вводятся два натуральных числа К и L не превосходящие 1000 000.

Формат вывода

Выведите ''yes", если Александр выбрал этот кинотеатр или ''no"в противном случае.

Пример1

Ввод                           Вывод

9 9                                 yes

Пример2

Ввод                           Вывод

9 10                                no

Решение:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    cin>>n>>m;
    if(n%2!=0 && m%2!=0)cout<<"yes";
    else cout<<"no";
    return 0;
}

 

Задача 4.

В целях борьбы со списыванием во  время СОРа компания ''Рудик и К☺" создала программу, проверяющую совпадение решений учеников (проверку на плагиат). Числом совпадения символов двух строк назовем количество пар равных символов, образованных из i-того символа первой строки и i-того символа второй строки.

Формат ввода

Вводятся две строки одинаковой длины,  состоящие только из строчных латинских букв.

Формат вывода

Требуется вывести процент совпадения с 2-мя знаками после запятой.

Пример

Ввод                          Вывод

print                           20,00

input

Комментарии

1*100/5=20, 1-один совпадающий символ, 5- количество символов в строке.

Решение:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string n,m;
    cin>>n>>m;
    int k=0;
    for(int i=0;i<n.size();i++){
        if (n[i]==m[i])k++;
    }
    cout<<fixed<<setprecision(2)<<k*100.0/n.size();
    return 0;
}

 

Задача 5.

Таня не любит информатику, но старается получить хотя бы четверку за четверть. Таня заметила следующую закономерность: по нечетным дням месяца она получала тройки, по четным - четверки. Помогите Тане расположить четные и нечетные числа дней месяца в разных строчках, чтобы оценить, сколько у нее троек, а сколько четверок. Если четверок не меньше, чем троек Таня может рассчитывать на оценку четыре.

Формат ввода

В первой строке вводится  число N –количество дней, в которые проводились уроки информатики. 

Во второй строке вводятся N чисел: дни месяца

Формат вывода

Сначала выведите ''yes" или ''no" в зависимости от того, как Таня может рассчитывать на оценку четыре.

Затем выведите в разных строчках нечетные и четные числа дней месяца.

Пример 1

Ввод                                             Вывод

5                                                      yes

4 16 19 31 2                                  19 31

                                                         4 16 2

                               4

Пример 2

Ввод                                              Вывод

8                                                       no

​​29 4 7 12 15 17 24 1                    29 7 15 17 1

                                                          4 12 24

Решение:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n];
    vector<int>c,d;
    for(int i=0;i<n;i++){
        cin>>a[i];
        if(a[i]%2!=0)c.push_back(a[i]);
        else d.push_back(a[i]);
    }
    if(c.size()<=d.size())cout<<"yes"<<endl;
    else cout<<"no"<<endl;
    for(int i=0;i<c.size();i++) cout<<c[i]<<" ";
    cout<<endl;
    for(int i=0;i<d.size();i++) cout<<d[i]<<" ";
}

 

Rectangle 64.png
Логотип золотой.png
Полезные ссылки
Получайте последние новости

Любое использование материалов возможно только с активной ссылкой на сайт.

  • YouTube Социальные Иконка
  • Instagram
  • Facebook Социальной Иконка
  • Vkontakte Social Иконка
  • Telegram

© olymp.lizey8 2019 - 2020