noip2011选择客栈o(n)

一位神级大大说:这题不A的会编程么 orz

好吧,其实暴力贪心的方法虽然不是严格O(n)的但是也可以过0.0

所以这里只介绍O(n) 的思路和代码,即正解orz

我们枚举1~n的客栈,以我们枚举的客栈作为选择的最右边的客栈

1、如果这个客栈可以喝咖啡,那么它前面所有的客栈都可以选,choose=num, ans=ans+之前同色客栈数

      并且它之后与它同色的客栈都可以选,

     但是我们是顺序枚举,所以在更新完ans后把这个客栈也放到可以选择的客栈里即choose,那么以后与它同色就都可以选它了,同时该颜色客栈加1

2、如果这个客栈不能喝咖啡,那它这能有两种选择:(1)、中间有咖啡的(2)、另一个是可以喝咖啡的 总之就是可以选的

     所以此时我们不能傻傻的简单的把ans+之前同色客栈数而是可以选择的客栈数,即choose数组中与它同色的个数,同时它不能更新choose数组只能给该颜色客栈+1

总之就是用两个数组,一个记录各种颜色的客栈总数,一个记录各种颜色可以选择的客栈数,遇到一个可以当咖啡厅的就更新可以选择的=总数

总之,非常巧妙 orz QRZ

var
        n,m,p,a,b,ans   :longint;
        i               :longint;
        num,choose      :array[0..55] of longint;
begin
   read(n,m,p);
   for i:=1 to n do
   begin
      read(a,b);
      if (b<=p) then choose:=num;
      inc(ans,choose[a]);
      inc(num[a]);
      if (b<=p) then inc(choose[a]); 
   end;
   writeln(ans);
end.
——by Eirlys

转载请注明出处=w=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值