【枚举+优化】【NOIP2011提高组Day1】选择客栈

 

【样例输入输出】

hotel.inhotel.out
5 2 3
0 5
1 3
0 2
1 4
1 5
3

这一题朴素枚举能得60分,加上链表以及前缀和优化可以得100分!

由于只选两个客栈,所以很容易想到用枚举搜索的方法来实现,不过数据又太大,这就可以用前缀和(大家应该都懂吧,后面二分专题还会用到)的方式来进行优化,还需加上链表优化

话不多说,下面是Pascal代码,Pascal代码有点长,但是很详细

后面会给出C++ Code

Pascal Code

program hotel;

var
  n,kk,pp:longint;
  ans:longint;
  k,p:array[0..200000+10] of longint;
  num,sum,next:array[0..200000+10] of longint;

procedure init;
begin
  assign(input,'hotel.in');
  assign(output,'hotel.out');
  reset(input);
  rewrite(output);
end;

procedure outit;
begin
  close(input);
  close(output);
  halt;
end;

procedure readdata;
var
  i,j:longint;
begin
  read(n,kk,pp);
  
  for i:=1 to n do
  begin
    read(k[i],p[i]);
    sum[i]:=sum[i-1];
    if p[i]<=pp then inc(sum[i]);
  end;
  
  for i:=2 to n do
    for j:=i-1 downto 1 do
    begin
      if k[j]=k[i] then
      begin
        next[i]:=j;
        break;
      end;
    end;

  num[1]:=1;
  for i:=2 to n do
    num[i]:=num[next[i]]+1;
end;

procedure main;
var
  i,j,x:longint;
begin
  ans:=0;
  
  //朴素枚举+前缀和优化
  {for i:=1 to n do
  begin
    for j:=i+1 to n do//从i+1开始 避免重复计数
    begin
      if k[i]<>k[j] then continue;//色调不同 跳过
      if sum[j]-sum[i-1]>0 then inc(ans);
    end;
  end;}
  
  //链表枚举+前缀和优化
  for j:=2 to n do
  begin
    i:=next[j];
    while i<>0 do
    begin
      if sum[j]-sum[i-1]>0 then
      begin
        inc(ans,num[i]);
        break;
      end;
      i:=next[i];
    end;
  end;
  
  writeln(ans);
end;


begin
  init;
  readdata;
  main;
  outit;
end.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值