// PascalABC.NET 3.1, сборка 1218 от 12.04.2016 const n=10;
type Sot=record fam:string; zp:integer; end;
begin var Sotr:=new Sot[n]; Writeln('Вводите фамилию и через пробел зарплату'); for var i:=0 to n-1 do begin var s:=ReadlnString(i+1+':'); var ms:=s.Split; (Sotr[i].fam,Sotr[i].zp):=(ms[0],StrToInt(ms[1])); end; var r:=Sotr.OrderBy(x->x.zp).First; WritelnFormat('{0} получает всего лишь {1}',r.fam,r.zp) end.
Тестовое решение: Вводите фамилию и через пробел зарплату 1: Иванов 32000 2: Петров 28000 3: Козлов 34000 4: Сидорова 41400 5: Пупкин 30000 6: Кузьмина 36000 7: Васечкин 29700 8: Бененсон 32500 9: Паутова 41000 10: Ромашкин 36400 Петров получает всего лишь 28000
Shelchkowa453
08.04.2023
//PascalABC.NET (версия 3.1, сборка 1210 от 29.03.2016) const n = 10; type tabel = record f: string[20]; money: integer; end;
var a: array[1..n] of tabel; i, min, imin: integer;
begin min := a[1].money;imin := 1; for i := 1 to n do begin write('Введите Фамилию ',i,' сотрудника : '); readln(a[i].f); write(a[i].f,' получает :'); readln(a[i].money); if a[i].money < min then begin min := a[i].money;imin := i; end; end; writeln(a[imin].f, ' получает меньше всех '); end.
Тестовое решение: Введите Фамилию 1 сотрудника : Иванов Иванов получает :15000 Введите Фамилию 2 сотрудника : Петров Петров получает :12000 Введите Фамилию 3 сотрудника : Сидоров Сидоров получает :30000 Введите Фамилию 4 сотрудника : Железнов Железнов получает :75000 Введите Фамилию 5 сотрудника : Греков Греков получает :23000 Введите Фамилию 6 сотрудника : Смирнов Смирнов получает :34000 Введите Фамилию 7 сотрудника : Сурков Сурков получает :27000 Введите Фамилию 8 сотрудника : Водный Водный получает :14000 Введите Фамилию 9 сотрудника : Беляев Беляев получает :33000 Введите Фамилию 10 сотрудника : Жуков Жуков получает :17000 Петров получает меньше всех
pisikak999
08.04.2023
Я буду думать, что сочетание - набор нулей и единиц, в котором на i-м месте стоит 0, если i-й буквы нет в сочетании, и 1, если она есть. Тогда, например, (0111) соответствует bcd. Общее число чисел по условию N, число единиц равно K. Этот список упорядочен по убыванию, и нам необходимо найти M-е число в этом списке. Всего число выбрать K элементов из N равно C_N^K ("цэ из N по K"). Поймем, например, надо ли брать 1-й элемент. Всего сочетаний, где первый элемент взят: C_(N-1)^(K-1) {в самом деле, в этом случае осталось выбрать K-1 из оставшихся N-1}; не взят: C_(N-1)^K. Учитывая, что те, в которые первый элемент входит, идут перед теми, в которые он не входит, решаем: если M > C_(N-1)^(K-1), 1-й элемент не берём, иначе берём. Дальше если 1-й взяли, M оставляем таким же, если нет - уменьшаем на C_(N-1)^(K-1). Процесс повторяем, пока не найдем все буквы. Осталось понять, как считать C_N^K. Исходя из рассуждений выше, C_N^K = C_(N-1)^(K-1) + C_(N-1)^K. Кроме того, C_N^0 = 1 для всех N, C_N^K = 0 при K < 0 или K > N. Пользуясь этим, можно найти все C_N^K. Не забываем про длинную арифметику: C_N^K может не влезать в обычные типы данных. Я буду писать на PascalABC.NET, там длинная арифметика есть - тип BigInteger, если нет - легко найти, как это писать. (Update: в данном случае всё влезет в longint - биномиальные коэффициенты не превысят 10 миллионов с небольшим). Итак, вот и искомый код: begin var N, K: integer; read(N, K); var M := ReadString().ToBigInteger(); var C: array[,] of BigInteger := new BigInteger[N, K]; for var j := 1 to K - 1 do C[0, j] := 0; for var i := 0 to N - 1 do C[i, 0] := 1; for var i := 1 to N - 1 do for var j := 1 to K - 1 do C[i, j] := C[i - 1, j] + C[i - 1, j - 1]; var possible := 'a'; while K > 0 do begin if M <= C[N - 1, K - 1] then begin write(possible); dec(K); end else M := M - C[N - 1, K - 1]; dec(N); inc(possible); end; end.
Без BigInteger: begin var N, K: integer; var M: longint; read(N, K, M); var C: array[,] of longint := new longint[N, K]; for var j := 1 to K - 1 do C[0, j] := 0; for var i := 0 to N - 1 do C[i, 0] := 1; for var i := 1 to N - 1 do for var j := 1 to K - 1 do C[i, j] := C[i - 1, j] + C[i - 1, j - 1]; var possible := 'a'; while K > 0 do begin if M <= C[N - 1, K - 1] then begin write(possible); dec(K); end else M := M - C[N - 1, K - 1]; dec(N); inc(possible); end; end.
Раисовна878
08.04.2023
Var n,k,i,d,m:longint; b:array[1..26] of boolean;
procedure writesymbol(j:longint); begin write(chr(ord('a')+j-1)); end;
procedure print(x:longint); var z,h,p:longint; begin z := 0; p := 0; while true do begin p := p + 1; if b[p] = false then z := z + 1; if z = x then break; end; x := p; b[x] := true; writesymbol(x); end;
function fa_l(a,b:longint):longint; var s,h:longint; begin s := 1; for h := a to b do s := s * h; fa_l := s; end;
begin read(n,k,m);
d := fa_l(n-k+1,n-1);
for i := k downto 1 do begin print((m - 1) div d + 1); if m mod d = 0 then m := d else m := m mod d; d := d div (n - (k - i + 1)); end; end.
Ответить на вопрос
Поделитесь своими знаниями, ответьте на вопрос:
Программа в паскале. даны фамилии 10 сотрудников и зарплаты каждого. вывести фамилию сотрудника с наименьшей зарплатой
const
n=10;
type
Sot=record
fam:string;
zp:integer;
end;
begin
var Sotr:=new Sot[n];
Writeln('Вводите фамилию и через пробел зарплату');
for var i:=0 to n-1 do begin
var s:=ReadlnString(i+1+':');
var ms:=s.Split;
(Sotr[i].fam,Sotr[i].zp):=(ms[0],StrToInt(ms[1]));
end;
var r:=Sotr.OrderBy(x->x.zp).First;
WritelnFormat('{0} получает всего лишь {1}',r.fam,r.zp)
end.
Тестовое решение:
Вводите фамилию и через пробел зарплату
1: Иванов 32000
2: Петров 28000
3: Козлов 34000
4: Сидорова 41400
5: Пупкин 30000
6: Кузьмина 36000
7: Васечкин 29700
8: Бененсон 32500
9: Паутова 41000
10: Ромашкин 36400
Петров получает всего лишь 28000