要修M牛棚 则有M-1段是空着的 自然找出前M-1个最大空隙不计
此题数据不大 用排序的话显得普通代码过于臃肿
本人使用的是计算排序思路 开一个 1..200 的数组来记录
代码如下
{
ID: yaoyuan4
PROG: barn1
LANG: PASCAL
}
Program barn1;
const
inf = 'barn1.in'; outf = 'barn1.out';
var
m, s, c, ans : longint;
f : array[1..200] of boolean;
op : array[1..200] of longint;
Procedure init;
var
i, x : longint;
begin
fillchar(f, sizeof(f), false);
assign(input, inf); reset(input);
readln(m, s, c);
for i := 1 to c do
begin
read(x);
f[x] := true;
end;
close(input);
ans := 0;
end;
Procedure work;
var
i, j, t, m1, m2 : longint;
begin
for i := 1 to s do
if f[i] then
begin
m1:= i;
dec(ans, m1);
break;
end;
for i := s downto 1 do
if f[i] then
begin
m2 := i;
inc(ans, m2);
break;
end;
inc(ans, m);
i := m1;
fillchar(op, sizeof(op), 0);
repeat
while not f[i] do inc(i);
j := i + 1;
while not f[j] do inc(j);
inc(op[j-i]);
i := j;
until i >= m2;
t := m - 1;
for i := s downto 1 do
if op[i] > 0 then
if t > op[i] then
begin
dec(t, op[i]);
dec(ans, op[i] * i);
end
else
begin
dec(ans, t * i);
break
end;
end;
Procedure print;
begin
assign(output, outf); rewrite(output);
if m < c then writeln(ans) else writeln(c);
close(output);
end;
begin
init;
work;
print;
end.