- •Ответы на задачи с4:
- •Var tMonth: array[1..12] of real;
- •I, month: integer;
- •Var count: array[1..26] of integer;
- •Var count:array[1..26] of integer;
- •I, k, cA, cAm, iMax:integer;
- •Var count:array['a'..'z']of integer;
- •Var Info: array[1..100] of record
- •I, k, p, n, c: integer;
- •Var Info: array[1..Lim] of record
- •I, k, n, mark, max: integer;
- •Var names: array[1..Lim] of string;
- •I, k, n, ball, mark, max, count: integer;
- •Var Info: array[1..Lim] of record
- •I, k, n, mark, max1, max2, max3: integer;
- •Var name: array[1..Lim] of string;
- •I, k, count, mark1, mark2, n: integer;
- •Var podr: array[1..100] of integer;
- •If not exist then begin
- •Var podr: array[1..100] of integer;
- •I, k, p, count, n: integer;
- •If not exist then begin
- •Var podr: array[0..99] of boolean;
- •I, k, p, count, n: integer;
- •Var podr: set of 0..99;
- •Var ballBest: array[1..2] of integer; { результат (баллы) }
- •Var ballBest: array[1..2] of integer;
- •I, j, k, ball: integer; { вспомогательные переменные }
- •Var Best: array[1..2] of record
- •I, j, k, ball: integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •I, j, k, price: integer;
- •Var Total: array[0..Max] of integer;
- •Var Count: array[0..Max,7..11] of integer;
- •I, j, class, ball, minBall, Sum: integer;
- •Var List: array[1..500] of string;
- •Var List: array[1..500] of string;
- •I, j, n, ball1, ball2, count: integer;
- •Var List: array[1..500] of string;
- •I, j, n, ball1, ball2, count: integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •I, j, k, price: integer;
- •Var count: array[1..26] of integer;
- •Var count: array['a'..'z'] of integer;
- •Inc(nOdd);
- •Var count: array['a'..'z'] of integer;
- •I, nOdd: integer;
- •Inc(nOdd);
- •Var Info: array[1..1000] of tInfo;
- •Var temp: tInfo;
- •Var Info: array[1..1000] of tInfo;
- •Var h, m, code0: integer;
- •Var Info: array[1..1000] of tInfo;
- •Var Info: array[1..1000] of tInfo;
- •Var h, m, code0: integer;
- •If c in ['a'..'z', 'a'..'z'] then ...
- •If c in['a'..'z','a'..'z'] then
- •Var Names: array[1..Max] of string;
- •Var count: array[1..Max] of integer;
- •Var nParties: integer;
- •Var Names: array[1..Max] of string;
- •Var Parties: array[1..Max] of tParty;
- •Var Parties: array[1..Max] of tParty;
- •Val(Copy(s,1,2), d, c);
- •Val(Copy(s,4,2), m, c);
- •Val(Copy(s,7,4), y, c);
- •Var s, Name, minName: string;
- •Val(Copy(s,1,2), d, c);
- •Val(Copy(s,4,2), m, c);
- •Val(Copy(s,7,4), y, c);
- •Var s, Name, specDate, minName, minDate: string;
- •Var name,name1,name2:string;
- •I, j, n, school, ball,
- •Var sum, count: array[1..99] of integer;
- •Var sum, count: array[1..99] of integer;
- •I, n, sch, ball, k, total: integer;
- •If s[I] in ['a'..'z','a'..'z'] then
- •If inside then begin
- •Var s: string;
- •Var word: string;
- •Var count:array[0..100] of integer;
- •I, n, sch, ball, m, s: integer;
- •Var c: char;
- •I, k, count: integer;
- •Var c, I: char;
- •Var c: char;
- •I, j, k: integer;
- •Var c:char;
- •I, j, k:integer;
- •Var num: array['0'..'9'] of integer;
- •I, min: integer;
- •Var c: char;
- •I, k, count: integer;
- •Var c, I: char;
- •Var c: char;
- •Var num: array['1'..'9'] of integer;
- •Var num: array['1'..'9'] of integer;
- •Val(Copy(s,1,2), d, I);
- •Var dm: array[1..12] of integer;
- •Val(Copy(s,1,p-1), c.No, k); { номер слева от пробела }
- •Var maxStip: array[1..5] of integer;
- •Var I, k, n: integer;
- •Var first: array[1..5] of integer;
- •Var I, n, kurs, stip: integer;
- •Var people: array[1..Max-1] of integer;
- •Var Delta: array[1..Max] of integer;
- •Var Delta: array[1..Max] of integer;
- •I, s1, s2, n, p, min: integer;
- •Var people: array[1..Max-1] of integer;
- •I, j, s1, s2, n, p, min: integer;
- •Var schMax, schCount: array[1..Max] of integer;
- •Var schMax, schCount: array[1..Max] of integer;
- •I, n, sch, ball, count: integer;
- •Var f: Text; { указатель на текстовый файл }
- •X1, x2: real; { корни уравнения }
- •I, r: integer; { вспомогательные переменные }
- •Val(Copy(s,1,I-1), c, r);
- •Var Info: array[1..Max] of tInfo;
- •Var Info: array[1..Max] of tInfo;
- •I, j, n, zNo: integer;
- •Var count: array[1..Max] of integer;
- •Var count: array[1..Max] of integer;
- •I, j, nMin, n, zNo: integer;
- •Var Info: array[1..Max] of tInfo;
- •I, j, n, k: integer;
- •Var X, count, c, c0, max, max2, max3, max6: integer;
- •Var X, Xprev, n, l, lMax: integer;
- •Var X, Xprev, Xstart, n, lMax: integer;
- •Var k: char;
- •Var I, sumFf: integer;
- •Var I, count1, count2, sumFf: integer;
- •Var I, j, count1, count2, sumFf: integer;
- •Var words: array[1..27] of string;
- •Var sum, p, I, j, n, number: integer;
- •Var j: integer;
- •Var sum, p, I, V, n,number: integer;
- •Var j: integer;
- •Var words: array[1..99] of string;
- •Var sum, I, j, n: integer;
- •Var count: array['a'..'z'] of integer;
- •Var s: string;
- •Var letters: array['a'..'z'] of char;
- •Var count: array['a'..'z'] of integer;
- •I: integer;
- •Var count: array[1..26] of integer;
- •I, k: integer;
- •Var count: array[1..26] of integer;
- •I, k: integer;
- •Var w: array[1..26] of structW;
- •I, k: integer;
- •Var count: array[1..26] of integer;
- •I, k, max: integer;
- •97 Http://kpolyakov.Narod.Ru
Var Info: array[1..1000] of tInfo;
M, N, i, j, ball, mesto: integer;
c: char;
temp: TInfo;
begin
readln(N); { число спортсменов }
readln(M); { число видов многоборья }
for i:=1 to N do begin
Info[i].name := '';
for j:=1 to 2 do { читаем два блока: фамилию и имя }
repeat
read(c);
Info[i].name := Info[i].name + c;
until c = ' ';
{ читаем баллы и суммируем их }
Info[i].sum := 0;
for j:=1 to M do begin
read(ball);
Info[i].sum := Info[i].sum + ball;
end;
end;
{ сортировка массива }
for i:=1 to N-1 do
for j:=N-1 downto i do
if Info[j].sum < Info[j+1].sum then begin
temp := Info[j];
Info[j] := Info[j+1];
Info[j+1] := temp;
end;
{ вывод таблицы результатов }
mesto := 1;
for i:=1 to N do begin
if (i > 1) and (Info[i].sum < Info[i-1].sum) then
mesto := mesto + 1;
writeln(Info[i].name, ' ', Info[i].sum, ' ', mesto);
end;
end.
В этой задаче используются данные типа «время», которые вводятся в символьном виде. Работать с ними в таком формате (например, сравнивать) неудобно, потому нужно переводить время в числовую форму, например, в число минут от 00:00. Так время 09:45 преобразуется в число 60*9+45=585.
Поскольку эта операция выполняется неоднократно в разных местах программы (сначала ввод текущего времени в первой строке, а потом – ввод времени освобождения ячейки для каждого пассажира), удобно написать функцию, которая преобразует символьную строку в формате hh:mm (hh обозначает часы, а mm – минуты) в целое число так, как рассказано выше. Вот пример такой функции:
function Time2Int(sTime: string): integer;
Var h, m, code0: integer;
begin
code0 := Ord('0');
h := 10*(Ord(sTime[1])-code0) + (Ord(sTime[2])-code0);
m := 10*(Ord(sTime[4])-code0) + (Ord(sTime[5])-code0);
Time2Int := 60*h + m;
end;
Здесь в переменную code0 мы записываем код символа '0', чтобы не вычислять его повторно.
В условии сказано, что число пассажиров в списке не превышает 1000, это явное указание на то, что нужно прочитать данные в массив записей примерно такой структуры:
type TInfo = record
name: string[20]; { фамилия }
time: integer; { время освобождения ячейки }
end;
Сам массив мы объявим так:
Var Info: array[1..1000] of tInfo;
Сложность заключается в том, что нам нужно записывать в массив информацию только о тех пассажирах, для которых время освобождения ячейки не больше, чем curTime+120, где curTime – текущее время. Все остальные строки нужно игнорировать. Это значит, что требуется ввести счетчик count (целую переменную) , в которой мы будем хранить количество «хороших» пассажиров, которые освободят свои ячейки не более, чем через 2 часа (120 минут). Получается такой цикл ввода:
count := 0;
for i:=1 to N do begin
... { здесь ввести данные в Info[count+1] }
if Info[count+1].time <= curTime+120 then
count := count + 1;
end;
Иначе говоря, мы вводим данные в первый неиспользованный элемент массива Info, а к следующему переходим только тогда, когда очередной пассажир «хороший» и его данные нужно сохранить.
Как вводить данные? Хотя все официальные рекомендации по решению задачи С4 основаны на посимвольном вводе данных, многие профессионалы предпочитают сначала прочитать всю очередную строку в символьную переменную s, а потом «разбирать» ее в памяти. В данном случае такой подход позволяет значительно упростить программу, и мы его применим (для разнообразия).
Будем вводить строку s целиком, искать пробел и делить ее на две части (слева от пробела – фамилия, справа – время). Затем время преобразуем в целое число с помощью уже написанной функции Time2Int:
for i:=1 to N do begin
readln(s);
p := Pos(' ', s);
Info[count+1].name := Copy(s,1,p-1);
Info[count+1].time := Time2Int(Copy(s,p+1,Length(s)-p));
if Info[count+1].time <= curTime+120 then
count := count + 1;
end;
Теперь остается только отсортировать массив и вывести список фамилий в нужном порядке. Важно не забыть, что нужно сортировать не N элементов, а count (именно столько мы нашли «хороших» пассажиров):
for i:=1 to count do
for j:=count-1 downto i do
if Info[j].time > Info[j+1].time then begin
temp := Info[j];
Info[j] := Info[j+1];
Info[j+1] := temp;
end;
Вот полная программа:
type TInfo = record
name: string[20];
time: integer;
end;