#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; }
Говорят, что плохой программист – это тот, кто считает, что в одном килобайте 1000 байт, а хороший программист – это тот, кто полагает, что в одном километре 1024 метра. Многим эта шутка понятна, так как все знают, что в процессах, связанных с информатикой и компьютерной техникой, фигурирует множество значений, выражаемых степенью двойки, то есть чисел вида 2
K, где 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; }
Оргкомитет Московской городской олимпиады решил организовать экскурсию по Москве для участников олимпиады. Для этого был заказан двухэтажный автобус высотой 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) – информация о тройниках.
#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)
|
№
| 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
|
Последовательность чисел 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; }