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

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



#include

#include

using namespace std; 

int main(){

  int min =3*10000;

  int max =-3*10000;

  int k = 0;

  int n;

  

  while (scanf("%d", &n) == 1){

    k++;  

    if ((k % 2 == 1) && (min>n)) min = n;

    if ((k % 2 == 0) && (max
  

  cout << max + min;

  return 0; }
Задача 64 (№ 409) Железная дорога (Сложность: 26%)

При строительстве новой железной дороги возникли проблемы. Дорога пролегает по холмистой местности, однако сами пути должны идти строго горизонтально. Поэтому руководство строительной компании приняло решение выровнять поверхность земли на этом участке. Главная проблема состоит в том, что привозить или вывозить землю на стройку стоит 10000$ за кубический метр. Поскольку бюджет железной дороги невелик, этого нельзя себе позволить.

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

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

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



№

INPUT.TXT

OUTPUT.TXT

1

4
0 1 1 0

0.6666666667

2

5
2 2 2 2 2

2.0000000000
Первая строка входного файла содержит количество N (1 < N <= 30000) точек, в которых была замерена высота. Вторая строка содержит результаты замеров – i-ое число строки содержит высоту над уровнем моря точки, находящейся на расстоянии (i-1) метр от начала участка. Все высоты – целые неотрицательные числа, не превосходящие 10000. Считайте, что между соседними точками измерений земная поверхность строго прямолинейна.

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


В выходной файл выведите ответ на задачу с точностью, не меньшей 10-5.


#include

using namespace std;

int main() {

    int n ;

    double   s,h1,h2;

    cin >> n;

    cin >> h1;

    s = 0;

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

{

        cin >> h2;

    s=s+(h1+h2)/2;

    h1=h2;}

    s=s/(n-1);

    printf("%.5f", s);

    return 0; }




Холм может состоять из трапеций, прямоуголь-ников или треугольников со стороной =1 м.

S трапеции= =(h1+h2)/2

S прямоугольника (при h1=h2) и S треугольника (при h2=0) сводятся к той же формуле.

Что бы не использовать массив для каждой следующей фигуры превращаем h2 в h1 и читаем h2. Полученную площадь холма длим на (n-1), т.к. участков на 1 меньше чем точек измерения


Задача 65 (№ 779) Строительство школы (Сложность: 30%)


В деревне Интернетовка все дома расположены вдоль одной улицы по одну сторону от нее. По другую сторону от этой улицы пока ничего нет, но скоро все будет – школы, магазины, кинотеатры и т.д.

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

План деревни можно представить в виде прямой, в некоторых целочисленных точках которой находятся дома учеников. Школу также разрешается строить только в целочисленной точке этой прямой (в том числе разрешается строить школу в точке, где расположен один из домов – ведь школа будет расположена с другой стороны улицы).

Напишите программу, которая по известным координатам домов учеников поможет определить координаты места строительства школы.


№

INPUT.TXT

OUTPUT.TXT

1

4
1 2 3 4

3

2

3
-1 0 1

0
Входные данные. В первой строке входного файла INPUT.TXT сначала записано число N — количество учеников (1 ≤ N ≤ 100000). Во второй строке записаны в строго возрастающем порядке координаты домов учеников — целые числа, не превосходящие 2∙109по модулю.

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


#include

using namespace std;

int main(){

long long int a, k, n;

cin>>n;

k=n/2+1;   

     

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

    cin>>a;

    if(i==k)  cout<
    return 0; }

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



Массивы


Задача 66 (№ 149). Разворот (Сложность: 9%)


Дано натуральное число N и последовательность из N элементов. Требуется вывести эту последовательность в обратном порядке.

Входные данные. В первой строке входного файла записано натуральное число N (N ≤ 103). Во второй строке через пробел идут N целых чисел, по модулю не превосходящих 103 - элементы последовательности.

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

В выходной файл выведите заданную последовательность в обратном порядке.

# include


№

INPUT

OUTPUT

1

3
1 2 3

3 2 1
using namespace std;

int main(){

int a[1000],n;

cin>>n;

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

cin>>a[i]; }

for (int i = n; i >= 1; i--){

cout<
return 0; }



Задача 67 (№ 284) Подмассив массива (Сложность: 15%)



№

INPUT

OUTPUT

1

6
1 2 3 4 5 6
5
1 1
2 6
3 4
5 6
2 4

1
2 3 4 5 6
3 4
5 6
2 3 4
Пусть задан массив целых чисел а1, а2, ..., аn. Назовем его подмассивом f(i,j) массив, составленный из чисел массива аi, ai+1,..., aj-1, aj. Напишите программу, которая будет выводить подмассивы массива a.

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


Первая строка входного файла содержит число n (1 <= n <= 1000) - количество элементов в массиве а. Во второй строке содержатся числа a1, a2, … , аn разделенные пробелом. Все аi находятся в диапазоне от -231 до 231 - 1. В третьей строке находится m (1 <= m <= 100) — количество подмассивов, которые необходимо вывести. Следующие m строк содержат пары чисел ik, jk (1 <= ik <= jk <= n).
Выходные данные. В выходной файл OUTPUT.TXT для каждой пары (ik,jk) в отдельной строке выведите подмассив f(ik,jk).

# include

using namespace std;

int main(){

int n,j,m,b,c;

int a[1001];

cin >>n;

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

cin>>a[i]; }

cin>>m;

for (int i = 1; i <= m; ++i){

cin>>b>>c;

for (int j = b; j <= c; ++j){

cout<
 cout<
return 0; }







читаем заданный массив



цикл по количеству тестов


вывод подмассива



Задача 68 (№ 496) Сбор черники (Сложность: 17%)

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

Эти кусты обладают разной урожайностью, поэтому ко времени сбора на них выросло различное число ягод – на i-ом кусте выросло ai ягод.


№

INPUT.TXT

OUTPUT

1

4
1 2 3 4

9

2

3
1 2 3

6
В этом фермерском хозяйстве внедрена система автоматического сбора черники. Эта система состоит из управляющего модуля и нескольких собирающих модулей. Собирающий модуль за один заход, находясь непосредственно перед некоторым кустом, собирает ягоды с этого куста и с двух соседних с ним. Напишите программу для нахождения максимального числа ягод, которое может собрать за один заход собирающий модуль, находясь перед некоторым кустом заданной во входном файле грядки.
Входные данные. Первая строка входного файла содержит целое число N (3 <= N <= 1000) – количество кустов черники. Вторая строка содержит N целых положительных чисел a1, a2, ..., aN – число ягод черники, растущее на соответствующем кусте. Все ai не превосходят 1000.

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





#include

using namespace std;

 int main() {

int N, arr[1002], max = 0;

cin >> N;

 for (int i = 0; i < N; i++) {cin >> arr[i]; }

arr[N] = arr[0];

arr[N + 1] = arr[1];

 

for (int i = 1; i <= N; i++) {

if (arr[i - 1] + arr[i] + arr[i + 1] > max)

max = arr[i - 1] + arr[i] + arr[i + 1]; }

cout << max;

return 0; }



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



Задача 69 (№ 637) NEERC (Сложность: 17%)


В полуфинале студенческого чемпионата мира по программированию NEERC (http://neerc.ifmo.ru) участвуют команды из n институтов. Участники для проведения соревнований распределяются по k залам, каждый из которых имеет размеры, достачные для размещения всех команд от всех институтов. При этом по правилам соревнований в одном зале может находиться не более одной команды от института.

Многие институты уже подали заявки на участие в полуфинале. Оргкомитет полуфинала хочет допустить до участия максимально возможное количество команд. При этом, разумеется, должна существовать возможность рассадить их по залам без нарушения правил.


№

INPUT

OUTPUT

1

3
1 2 4
3

6

2

3
1 2 4
4

7
Напишите программу, определяющую максимальное количество команд, которые можно допустить до участия в полуфинале.

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

Первая строка входного файла INPUT.TXT содержит число n - число институтов, подавших заявки. Вторая строка входного файла содержит n чисел a1, …, an (ai - это количество команд, заявленных от института номер i). Последняя строка входного файла содержит число k - количество залов, в которых проходят соревнования.

Все числа во входном файле целые, положительные и не превосходят 10000.

Выходные данные.
В выходной файл выведите одно целое число - ответ на задачу.

#include

using namespace std;

int main() {

int n,k,a[10000],s=0,x;

cin>>n;

for(int i=0;i>a[i];}

cin>>k;

for(int i=0;i
if(a[i]>k)

x=k; else x=a[i];

s=s+x; }

cout<
return 0; }

Если команд больше чем залов, то берем столько команд, сколько залов. Иначе берем все команды.




Задача 70 (№ 293) Налоги (Сложность: 20%)


В некотором государстве действует N фирм, конкурирующих между собой. У каждой фирмы есть некоторая прибыль в год, равная V[i] американских рублей. У царя есть любимые фирмы, а есть нелюбимые. Соответственно, налог для всех фирм разный и назначается царем в индивидуальном порядке. Налог на i-ую фирму равен p[i] %. Собиратели статистики решили посчитать, с какой фирмы в государственную казну идет наибольший доход (в казну идут все налоги). К сожалению, они не учили в детстве ни математику, ни информатику (так что учитесь, дети!), и их задача резко осложняется. Помогите им в этой нелегкой задаче.

№

INPUT

OUTPUT

1

1
1
1

1

2

2
1 2
3 2

2

3

3
100 1 50
0 100 3

3
Входные данные. Во входном файле сначала записано число N - число фирм (0 < N ≤ 100). Далее идет N целых неотрицательных чисел, не превышающих 154 - доходы фирм, а затем еще N целых чисел от 0 до 100 - налоги фирм в процентах.

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



#include

#include

using namespace std;

int main(){

    int n;float max=0;int f=0;int i;float money[100],pr[100]; float nal[100];int h=0;

    cin>>n;

    for(i=0;i>money[i]; }

    for(i=0;i>pr[i];}

     for(i=0;i
            nal[i]=money[i]/100*pr[i];

        if(nal[i]>max) {max=nal[i];h=i;  }    }

        cout<

Задача 71 (№ 912) Одежда (Сложность: 24%)


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


№

INPUT.TXT

OUTPUT.TXT

1

6
1 2 5 2 1 2

2

2

4
5 5 4 4

0
Путешественник стоит на высоком холме недалеко от входа в город. С этого холма он видит цвет одежды каждого жителя города. Путешественник торопится войти в город, ему важно быстро определить, традициям какого народа следовать в этом городе.

Входные данные. Первая строка входного файла INPUT.TXT содержит число N - количество жителей города, которых видит путешественник (1 ≤ N ≤ 104). Вторая строка теста содержит N натуральных чисел, разделенных пробелами. Каждое число сi – это цвет одежды i-го жителя (1 ≤ ci ≤ 100).

Выходные данные. В выходной файл OUTPUT.TXT выведите единственное целое число – цвет одежды народа, традициям которого следуют жители города.


#include

using namespace std;

int main() {

int n,k,a,z;

int arr[100];

for(int i=0;i<=100;i++)

{arr[i]=0;}

cin>>n;

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

{ cin>>a; arr[a]++; }

int max=0;

z=0;

for(int i=1;i<=100;i++)

{ if(arr[i]>max) {max=arr[i]; z=i; }}

k=0;

for(int i=1;i<=100;i++){

if(max==arr[i]) k++; }

if (k==1) cout<
return 0;}


Будем использовать сортировку подсчетом. Создаем и обнуляем массив, размер которого= количеству цветов. i-я ячейка соответствует i-му цвету. Нужно подсчитать количество каждого цвета.

Читаем цвет (а) и увеличиваем соответствующую ячейку на 1.

Находим самый популярный цвет (мах)

Проверяем условие: если оказывается, что таких народов (мах) несколько, то выбираем белый цвет, который обозначается нулём

Задача 72 (№ 534) Клавиатура – 2 (Сложность: 25%)

Всем известно, что со временем клавиатура изнашивается, и клавиши на ней начинают залипать. Конечно, некоторое время такую клавиатуру еще можно использовать, но для нажатий клавиш приходиться использовать большую силу. При изготовлении клавиатуры изначально для каждой клавиши задается количество нажатий, которое она должна выдерживать. Если знать эти величины для используемой клавиатуры, то для определенной последовательности нажатых клавиш можно определить, какие клавиши в процессе их использования сломаются, а какие – нет. Требуется написать программу, определяющую, какие клавиши сломаются в процессе заданного варианта эксплуатации клавиатуры.
Входные данные. Первая строка входного файла содержит целое число N (1 ≤ N ≤ 100) – количество клавиш на клавиатуре. Вторая строка содержит n целых чисел – с1, с2, … , сN, где сi (1 ≤ сi ≤ 100000) – количество нажатий, выдерживаемых i-ой клавишей. Третья строка содержит целое число K (1 ≤ K ≤ 100000) – общее количество нажатий клавиш, и последняя строка содержит K целых чисел pj (1 ≤ pj ≤ N) – последовательность нажатых клавиш.

№

INPUT.TXT

OUTPUT

1

5
1 50 3 4 3
16
1 2 3 4 5 1 3 3 4 5 5 5 5 5 4 5

yes
no
no
no
yes
Выходные данные
В выходной файл OUTPUT.TXT необходимо вывести N строк, содержащих информацию об исправности клавиш. Если i-ая клавиша сломалась, то i-ая строка должна содержать слово "yes" (без кавычек), если же клавиша работоспособна – слово "no".


#include

#include

using namespace std;

int main(){

int n,k,p;

int key[2][101];

cin>>n;

for(int j=1;j<=n;j++){cin>>key[0][j];}

for(int j=1;j<=n;j++){key[1][j]=0;}
cin>>k;

for(int i=1;i<=k;i++){

cin>>p;

key[1][p]++; }

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

if(key[0][i]>=key[1][i]) cout<<"no"<
else cout<<"yes"<
return 0;}

Задача также решается сортировкой подсчетом.
Для решения используется массив из двух строк:

0 строка – допустимое число нажатий клавиши,

1 строка- сколько раз была нажата клавиша


1

клавиша

2

клавиша

3

клавиша

4

клавиша

5

клавиша

1

50

3

4

3

2

1

3

3

7



Задача 73 (№ 579) Модуль суммы (Сложность: 25%)

Дана последовательность целых чисел. Требуется найти подпоследовательность заданной последовательности с максимальным модулем суммы входящих в нее чисел. Напомним, что модуль целого числа x равняется x, если x ≥ 0 и -x, если x < 0.
Входные данные. Первая строка входного файла INPUT.TXT содержит натуральное число n (1 ≤ n ≤ 10000) - длину последовательности. Во второй строке записаны n целых чисел, по модулю не превосходящих 10000. Выходные данные. В первой строке выходного файла OUTPUT.TXT выведите длину l выбранной вами подпоследовательности. Во второй строке должны быть записаны l различных чисел, разделенных пробелами - номера выбранных членов последовательности.

#include

#include

using namespace std;
int main() {

int n,k,a[10000];

int kp=0;

int ko=0;

int Sp=0;

int So=0;

cin>>n;

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

cin>>a[i];

if (a[i]>0) {Sp=Sp+a[i]; kp++;}

if (a[i]<0) {So=So+a[i]; ko++;}

}
if (Sp>abs(So)){

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

if (a[i]>0) cout<
}
if (Sp
cout<
for(int i=1;i<=n;++i){

if (a[i]<0) cout<
}

if (Sp==0 and So==0) cout<<"1 1";

return 0; }

№

INPUT.TXT

OUTPUT

1

5
-1 4 -1 6 -7

2
2 4


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


Иначе выводим количество отрицательных чисел и их номера


Если даны все нули, то ответ 1 1


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