Решение задач: Составители

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Выходные данные. В выходной файл OUTPUT.TXT выведите YES, если палатки указанным образом выбрать можно, и NO в противном случае.


#include

using namespace std;

int main () {

int k, w, a1, a2, a3, b1, b2, b3;

cin >> k >> w;

cin >> a1 >> b1 >> a2 >> b2 >> a3 >> b3;

Проверяем, можно ли использовать 2 палатки


if (a1+a2<=w & b1+b2>=k){cout << "YES"; return 0;}

if (a1+a3<=w & b1+b3>=k){cout << "YES"; return 0;}

if (a2+a3<=w & b2+b3>=k){cout << "YES"; return 0;}

Проверяем, можно ли использовать 3 палатки

if (a1+a2+a3<=w & b1+b2+b3 >= k){cout << "YES";

return 0; }


Проверяем, можно ли использовать 1 палатку

if (a1<=w & b1>=k) {cout << "YES";return 0;}

if (a2<=w & b2>=k) {cout << "YES"; return 0;}

if (a3<=w & b3>=k) {cout << "YES"; return 0;}
cout << "NO";

return 0; }
Задача 47 (№ 667) Автобусы – 2 (Сложность: 28%)


№

INPUT.TXT

OUTPUT.TXT

1

10 4 7

2

2

10 4 5

0
Для заезда в оздоровительный лагерь организаторы решили заказать автобусы. Известно, что в лагерь собираются поехать N детей и M взрослых. Каждый автобус вмещает K человек. В каждом автобусе, в котором поедут дети, должно быть не менее двух взрослых. Определите, удастся ли отправить в лагерь всех детей и взрослых, и если да, то какое минимальное количество автобусов требуется для этого заказать.

Входные данные


В единственной строке входного файла INPUT.TXT записано через пробел 3 натуральных числа - N, M и K, каждое из них не превосходит 10 000.

Выходные данные


В единственную строку выходного файла OUTPUT.TXT нужно вывести количество автобусов, которые нужно заказать. Если же отправить всех в лагерь невозможно, выведите 0 (ноль).


#include

using namespace std;

int main () {

long d, w, a, ka;

cin>> d >> w>>a;

if (a<=2 and d>0) ka=0;
else {

ka=d/(a-2);

if (d%(a-2)!=0) ka++;
if (ka*2>w) ka=0;

else {ka=(d+w)/a;

if ((d+w)%a!=0) ka++;}

}

cout << ka;

return 0; }






Поездка невозможна, если автобусы будут вмещать 1 или 2 чел.
Находим, сколько автобусов нужно для детей (+1 автобус может быть не полный)
Проверяем, есть ли у нас нужное число взрослых.

Взрослых может быть больше, чем по 2 на каждый автобус, поэтому

количество автобусов=

Добавляем неполный автобус


Циклические алгоритмы


Задача 48 (№ 106) Монетки (Сложность: 8%)



№

INPUT

OUTPUT

1

5
1
0
1
1
0

2
На столе лежат n монеток. Некоторые из них лежат вверх решкой, а некоторые – гербом. Определите минимальное число монеток, которые нужно перевернуть, чтобы все монетки были повернуты вверх одной и той же стороной.

Входные данные. В первой строке входного файла INPUT.TXT записано натуральное число N (1 <= N <= 100) – число монеток. В каждой из последующих N строк содержится одно целое число – 1 если монетка лежит решкой вверх и 0 если вверх гербом.

Выходные данные. В выходной файл OUTPUT.TXT выведите минимальное количество монет, которые нужно перевернуть.


Считаем количество 0 и 1; выводим наименьшее из них


#include

using namespace std;

int main (){

    int n,i,a0,b1,x;

    cin>>n;

    a0=0;

    b1=0;

    for (i = 1; i<=n; i++){

        cin>>x;

        if (x==0) (a0++);

        if (x==1) (b1++);

        }

    if (a0>b1) cout<
    return 0; }

Задача 49 (№ 692) Бинарные числа (Сложность: 8%)


Говорят, что плохой программист – это тот, кто считает, что в одном килобайте 1000 байт, а хороший программист – это тот, кто полагает, что в одном километре 1024 метра. Многим эта шутка понятна, так как все знают, что в процессах, связанных с информатикой и компьютерной техникой, фигурирует множество значений, выражаемых степенью двойки, то есть чисел вида 2K, где K – некоторое неотрицательное целое число. Назовем такие числа бинарными. Это такие числа как 2, 4, 8, 16, 32 и т.д. Действительно, когда речь идет о размере памяти или о разрешении экрана монитора, то мы часто наталкиваемся на бинарные числа. Все это связано с принципом хранения информации в памяти ЭВМ.

Задано целое число N. Требуется определить, является ли оно бинарным.

Входные данные. Входной файл INPUT.TXT содержит единственное целое число N, не превосходящее 10000 по абсолютной величине.

Выходные данные. В выходной файл OUTPUT.TXT выведите YES, если заданное число является бинарным, и NO в противном случае.

№

INPUT.TXT

OUTPUT

1

1024

YES

2

23

NO
#include

#include

using namespace std;

int main (){

int a;

cin>>a;

while (a%2==0 && a>1){a=a/2;}

if (a==1) cout<<"YES"; else cout<<"NO";

return 0; }

Задача 50 (№ 35) Конечные автоматы ( Сложность: 11%)



№

INPUT.TXT

OUTPUT

1

4
2 0
13 20
5 23
18 6

44344
48134
45699
49458

1

2
15 20
1000 26000

48767
1340237
Однажды известный профессор обнаружил описания k конечных автоматов. По его мнению, нетривиальность конечного автомата, имеющего n состояний и m переходов, можно описать целым числом d = 19m + (n + 239)*(n + 366) / 2 . Чем больше d, тем больший интерес для науки представляет изучение его свойств. Помогите профессору вычислить нетривиальность имеющихся у него автоматов.
Входные данные. Первая строка входного файла INPUT.TXT содержит целое число k (1 ≤ k ≤ 10000) – количество конечных автоматов. Следующие k строк содержат по два целых числа ni (0 ≤ ni ≤ 1000) и mi (0 ≤ mi ≤ 26ni2) – число состояний и переходов i-го автомата.

Выходные данные. Выходной файл OUTPUT.TXT должен состоять из k строк. На i-й строке выходного файла выведите одно число – нетривиальность i-го автомата.



#include

using namespace std;

int main(){

long long int k,m,n;

int d;

cin>>k;

for(int i=0;i
cin>>n>>m;

d= 19*m + (n + 239)*(n + 366) / 2;

cout<
return 0; }


Задача 51 (№ 81) Арбузы (Сложность: 14%)


Иван Васильевич пришел на рынок и решил купить 2 арбуза: один для себя, а другой для тещи. Понятно, что для себя нужно выбрать арбуз потяжелей, а для тещи полегче. Но вот незадача: арбузов слишком много и он не знает, как же выбрать самый легкий и самый тяжелый арбуз? Помогите ему!

Входные данные

В первой строке входного файла задано одно число N – количество арбузов. Вторая строка содержит N чисел, записанных через пробел. Здесь каждое число – это масса соответствующего арбуза. Все числа натуральные и не превышают 30000.

Выходные данные

В выходной файл нужно вывести два числа через пробел: массу арбуза, который Иван Васильевич купит теще и массу арбуза, который он купит себе.
# include


№

INPUT

OUTPUT

1

5
5 1 6 5 9

1 9
# include

using namespace std;

int main () {

int n, max, i, min, ves;

cin>>n;

max=0; min=30001;

for (i = 1; i <=n; i++){

cin>>ves;

if (ves>max) (max=ves);

if (ves
cout<
return 0; }


Задача № 52 (№ 233). Автобусная экскурсия (Сложность: 14%)


Оргкомитет Московской городской олимпиады решил организовать экскурсию по Москве для участников олимпиады. Для этого был заказан двухэтажный автобус высотой 437 см. На экскурсионном маршруте встречается N мостов. Оргкомитет олимпиады очень обеспокоен тем, что высокий двухэтажный автобус может не проехать под одним из них. Им удалось выяснить точную высоту каждого из мостов. Автобус может проехать под мостом тогда и только тогда, когда высота моста превосходит высоту автобуса. Помогите организаторам узнать, можно ли провести эту экскурсию, а если нет, установите, под каким мостом автобус не сможет проехать.

Формат входных данных. Первая строка содержит число N (1≤ N≤1000). Далее идут N натуральных чисел, не превосходящих 1000, - высоты мостов в сантиметрах в том порядке, в котором они встречаются на пути автобуса.


№

INPUT.TXT

OUTPUT

1

1
763

No crash

2

3
763 245 113

Crash 2

3

1
437

Crash 1
Формат выходных данных. В единственную строку выходного файла нужно вывести фразу «No crash», если экскурсию можно провести. Если же экскурсию провести нельзя, то нужно вывести сообщение «Crash k», где k-номер первого из мостов, под которым автобус не сможет проехать.

#include

using namespace std;

int main (){

    int k,n,i,b,f;

    cin>>n;

    f=0;

    for (i = 1; i<=n; i++){

Считаем количество мостов k, под которыми проедет автобус.

        cin>>b;

        if (b>437) f++;     

else {

        cout<<"Crash "<
        }

        if (f==n) cout<<"No crash";

    return 0; }

Задача 53 (№ 131) Перепись (Сложность: 15%)


В доме живет N жильцов. Однажды решили провести перепись всех жильцов данного дома и составили список, в котором указали возраст и пол каждого жильца. Требуется найти номер самого старшего жителя мужского пола.

Входные данные

Во входном файле INPUT.TXT в первой строке задано натуральное число N – количество жильцов (N<=100). В последующих N строках располагается информация о всех жильцах: каждая строка содержит два целых числа: V и S – возраст и пол человека (1<=V<=100, S – 0 или 1). Мужскому полу соответствует значение S=1, а женскому – S=0.


№

INPUT.TXT

OUTPUT.TXT

1

4
25 1
70 1
100 0
3 1

2
Выходные данные

Выходной файл OUTPUT.TXT должен содержать номер самого старшего мужчины в списке. Если таких жильцов несколько, то следует вывести наименьший номер. Если жильцов мужского пола нет, то выведите -1.
#include

#include

using namespace std;

int main (){

    int n,v,s,i,c,max;

    cin>>n;

    max=0;

    for (i = 1; i<=n; i++){

        cin>>v>>s;

  if (s==1 && v>max) (max=v, c=i);  }

    if (max==0) cout<<-1;     else cout<
    return 0; }


Задача 54 (№ 818) Кипячение чая (Сложность: 14%)


В эту субботу у Васи день рождения и через 15 минут к нему придут гости. Ему срочно надо вскипятить чай, для того чтобы напоить им гостей. У Васи дома есть много литровых чайников (можно считать, что их бесконечное количество), а розетка всего одна. Т.к. вода кипятится очень долго, за 15 минут она успеет вскипятиться максимум один раз. Но Вася – мальчик не промах, он достал из кладовки N тройников, в i-том тройнике ai разъемов. Теперь Вася ломает голову: как ему соединить тройники и воткнуть эту систему в розетку, чтобы максимизировать количество чайников, которые он сможет поставить кипятить.


№

INPUT.TXT

OUTPUT.TXT

1

1
1

1

2

3
2 5 4

9
Ваша задача заключается в написании программы, которая определит максимальное число чайников, которые возможно использовать для кипячения чая, используя данные тройники.
Входные данные. В первой строке входного файла INPUT.TXT содержится число N (1 ≤ N ≤ 105) – количество тройников. Во второй строке через пробел перечислены числа ai (1 ≤ ai ≤ 1000, 1 ≤ i ≤ N) – информация о тройниках.

Выходные данные. В выходной файл OUTPUT.TXT выведите ответ на задачу.





#include

using namespace std;

int main() {

int n,c,f;

f=0;

cin>>n;

for(int i=0;i
cin>>c;

f+=c-1; }

cout<
return 0; }



Складываем количество разъемов -1 (у каждого тройника один разъем уходит на подключение другого тройника)

В последнем тройнике используются все разъемы (+1)



Задача 55 (№ 264) Оттепель(Сложность: 17%)



№

INPUT.TXT

OUTPUT

1

6
-20 30 -40 50 10 -10

2

2

8
10 20 30 1 -10 1 2 3

4

3

5
-10 0 -10 0 -10

0
Уставшие от необычно теплой зимы, жители решили узнать, действительно ли это самая длинная оттепель за всю историю наблюдений за погодой. Они обратились к синоптикам, а те, в свою очередь, занялись исследованиями статистики за прошлые годы. Их интересует, сколько дней длилась самая длинная оттепель.

Оттепелью они называют период, в который среднесуточная температура ежедневно превышала 0 градусов Цельсия. Напишите программу, помогающую синоптикам в работе.

Входные данные. Во входном файле сначала записано число N – общее количество рассматриваемых дней (1 ≤ N ≤ 100). В следующей строке через пробел располагается N целых чисел, разделенных пробелами. Каждое число – среднесуточная температура в соответствующий день. Температуры – целые числа и лежат в диапазоне от –50 до 50.

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



#include

using namespace std;

int main() {

int n, t, kol = 0,max=0;

cin >> n;

for (int i = 0; i < n; i++) {

cin >> t;

if (t>0) { kol++;

if (kol > max) max = kol; } else kol = 0; }

cout << max;

return 0; }



Считаем количество kol положительных чисел и сравниваем это количество с мах. Если встречается отрицательное число, то kol=0

Задача 56 (№ 949) Фибоначчиева последовательность. (Сл.17%)


Последовательность чисел a1, a2, …, ai,… называется Фибоначчиевой, если для всех i ≥ 3 верно, что ai=ai-1+ai-2, то есть каждый член последовательности (начиная с третьего) равен сумме двух предыдущих.

Ясно, что, задавая различные числа a1 и a2, мы можем получать различные такие последовательности, и любая Фибоначчиева последовательность однозначно задается двумя своими первыми членами.

Будем решать обратную задачу. Вам будет дано число n и два члена последовательности: an и an+1. Вам нужно написать программу, которая по их значениям найдет a1 и a2.

Входные данные. Входной файл содержит число n и значения двух членов последовательности: an и an+1 (1 ≤ n ≤ 30, члены последовательности — целые числа, по модулю не превышающие 2×109).

Выходные данные. В выходной файл OUTPUT.TXT выведите два числа — значения первого и второго членов этой последовательности.


№

INPUT.TXT

OUTPUT.TXT

1

4 3 5

1 1
#include

using namespace std;

int main() {

int n,a,b,x;

cin>>n>>a>>b;

Отнимаем от последнего числа (b) предыдущее число (a). Чтобы не использовать массив записываем в а разность (a=b-a) , а в b-предыдущее число.
for(int i=0;i
x=a;

a=b-a;

b=x; }
cout<
return 0; }

Источник: https://tut-files.ru/previewfile/107733