- •Олимпиадные задачи и решения
- •Векторы (100 баллов)
- •Погодные условия (100 баллов)
- •Шоколадные плитки (100 баллов)
- •Работники (100 баллов)
- •Робот (100 баллов)
- •Зал Круглых Столов (100 баллов)
- •Вто (100 баллов)
- •Вишня (100 баллов)
- •Алхимия (100 баллов)
- •Цепь (100 баллов)
- •Казино (100 баллов)
- •Система уравнений (100 баллов)
- •Забавный конфуз
- •Соревнование
- •Абракадабра
- •Циферблат
- •Многоугольники
- •Квадрат
- •Лабиринт
- •Задача “Шифр”
- •Задача “Школы”
- •Последовательность
- •Автобус
- •Головоломка
- •Электронная почта
- •Виртуляндия
- •Конвейер
- •Новости
Последовательность
Дана последовательность, состоящая из 2N натуральных чисел. Известно, что все числа этой последовательности можно разбить на пары таким образом, что сумма чисел во всех парах будет одинаковой. Например, числа последовательности 99, 23, 77, 1 можно разбить на пары 1+99=77+23.
Задание Напишите программу SEQ, которая по такой последовательности определяет, можно ли эту последовательность разбить на пары таким образом, чтобы произведение чисел во всех парах было одинаковым.
Входные данные Файл SEQ.DAT содержит данные нескольких тестов. Первая строка содержит натуральное число - количество тестов в файле. Первая строка каждого теста содержит число 2N — количество чисел в последовательности. В каждой из последующих 2N строчек содержится целое число от 1 до 109 — элементы последовательности (1N50000).
Пример входного файла
2
4
99
23
77
1
2
1
10101
Выходные данные Файл SEQ.SOL должен содержать ответ на каждый из тестов в отдельной строке. Ответом на тест является символ 1, если входную последовательность можно разбить на пары, произведения в которых были бы одинаковыми, и 0 в противном случае.
Пример выходного файла
0
1
{$A+,B-,D+,E+,F-,G-,I-,L+,N+,O-,P-,Q-,R-,S-,T-,V+,X+}
{$M 16384,0,655360}
const
FileIn='seq.dat';
FileOut='seq.sol';
var
Fi, Fo : text;
N,i : longint;
ManyTests, Test : integer;
Current : longint;
Numbers : array[1..2] of longint;
NumCounter : array[1..2] of longint;
ManyNumbers,j : integer;
StillRight, Exist : boolean;
begin
Assign(Fi, FileIn);
Reset(Fi);
Assign(Fo, FileOut);
Rewrite(Fo);
ReadLn(Fi, ManyTests);
for Test:=1 to ManyTests do
begin
ReadLn(Fi, N);
StillRight:=true; ManyNumbers := 0;
for i:=1 to N do
begin
Read(Fi, Current);
if StillRight then
begin
Exist:=false;
for j:=1 to ManyNumbers do
if Numbers[j]=Current then
begin
Exist:=true;
inc(NumCounter[j]);
end;
if not Exist then
if ManyNumbers<2 then
begin
Inc(ManyNumbers);
NumCounter[ManyNumbers]:=1;
Numbers[ManyNumbers]:=Current;
end else StillRight:=false;
end;
end;
if (StillRight)and((ManyNumbers<2)or(NumCounter[1]=NumCounter[2])) then WriteLn(Fo, 1) else WriteLn(Fo, 0);
end;
Close(Fo);
Close(Fi);
end.
Автобус
Служебный автобус совершает один рейс по установленному маршруту и в случае наличия свободных мест подбирает рабочих, которые ожидают на остановках, и отвозит их на завод. Автобус также может ждать на остановке рабочих, которые еще не пришли. Известно время прихода каждого рабочего на свою остановку и время проезда автобуса от каждой остановки до следующей. Автобус приходит на первую остановку в нулевой момент времени. Продолжительность посадки рабочих в автобус считается нулевой.
Задание Написать программу BUS, которая определит минимальное время, за которое автобус привезет максимально возможное количество рабочих.
Входные данные Входной текстовый файл BUS.DAT в первой строке содержит количество остановок N и количество мест в автобусе M. Каждая i-я строчка из последующих N строчек содержит целое число — время движения от остановки і к остановке i+1 (N+1-я остановка — завод), количество рабочих K, которые придут на i-ю остановку, и время прихода каждого рабочего на эту остановку в порядке прихода (1M2000, 1N,K200000).
Пример входных данных.
3 5 1 2 0 1 1 1 2 1 4 0 2 3 4
Выходные данные Единственная строка выходного текстового файла BUS.SOL должен содержать минимальное время, необходимое для перевозки максимального количества рабочих.
Пример выходных данных. 4
{$A-,B-,D-,E-,F-,G-,I+,L-,N-,O-,P-,Q-,R+,S+,T-,V-,X-}
{$M 16384,0,655360}
{$M 65384,0,655360}
program cybus;
const
maxStop = 200000;
maxPasag = 2000;
type
tarr = array [0..maxPasag+1] of longint;
var
i,q,num:longint;
alldist,n,max,dist,distold,s,numpeople:longint;
global,cur:tarr;
function min(a,b:longint):longint;
begin if a<b then min:=a else min:=b;end;
function mx(a,b:longint):longint;
begin if a>b then mx:=a else mx:=b;end;
procedure union(coef:longint;var a:tarr;var b:tarr);
var i,j,k,m:longint;
c:tarr;
begin
fillchar(c,sizeof(c),0);a[a[0]+1]:=maxLongint;b[b[0]+1]:=maxLongint-coef;
i:=1;j:=1;k:=0;
m:=min(a[0]+b[0],max);
while m>k do
begin
inc(k);
if (a[i]<b[j]+coef) then begin c[k]:=a[i];inc(i);end
else begin c[k]:=b[j]+coef;inc(j);end;
end;
c[0]:=m;
b:=c;
end;
begin
assign(input,'bus.dat');reset(input);
assign(output,'bus.sol');rewrite(output);
read(num,max);s:=0;
numpeople:=0;alldist:=0;
for q:=1 to num do
begin
fillchar(cur,sizeof(cur),0);
read(dist,n);inc(alldist,dist);inc(numpeople,n);inc(s,dist);cur[0]:=min(n,max);for i:=1 to cur[0] do read(cur[i]);readln;
if q=1 then global:=cur else union(distold,cur,global);
distold:=dist;
end;
writeln(mx(global[global[0]]+dist,s));
{ writeln('Peoples: ',numpeople);
writeln('MinTime: ',s);}
close(output);
end.
