Section 1.3 Barn Pepair

要修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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值