tanya62soldatova72
?>

Программа в паскале. даны фамилии 10 сотрудников и зарплаты каждого. вывести фамилию сотрудника с наименьшей зарплатой

Информатика

Ответы

Darya Aleksei1173
// 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
//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
Я буду думать, что сочетание - набор нулей и единиц, в котором на 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
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 сотрудников и зарплаты каждого. вывести фамилию сотрудника с наименьшей зарплатой
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

ryazantseva
Olesya-elena1525
lyukiss
ragimovelshad
edubenskaya
rsksnb
Nekrasova
Владислав-Аветисян217
Fateevsa9
taanaami75
vantoslaltd
fermproddk
JisesLove19955
avolodyaev
Zhanibekrva Kandaurova