【枚举】【前缀和】【NOIP2011提高组Day1】选择客栈
2012-08-20 09:32
525 查看
![](http://pic002.cnblogs.com/images/2012/418409/2012082008415919.jpg)
![](http://pic002.cnblogs.com/images/2012/418409/2012082009124525.jpg)
![](http://pic002.cnblogs.com/images/2012/418409/2012082009125542.jpg)
【样例输入输出】
hotel.in | hotel.out |
5 2 3 0 5 1 3 0 2 1 4 1 5 | 3 |
![](http://pic002.cnblogs.com/images/2012/418409/2012082009140731.jpg)
这一题朴素枚举能得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.
![](http://pic002.cnblogs.com/images/2012/418409/2012082009304436.jpg)
相关文章推荐
- 【枚举+优化】【NOIP2011提高组Day1】选择客栈
- NOIP2011复赛提高组day1(A:铺地毯 B:选择客栈 C:mayan游戏)
- 【枚举优化】【NOIP2011提高组】选择客栈 hotel
- NOIP2011 提高组 复赛 day1 hotel 选择客栈
- 【枚举优化】【NOIP2011提高组】选择客栈 hotel
- 选择客栈 NOIP2011 提高组 Day1 T2
- LuoguP1311[NOIP2011] 选择客栈 解题报告【前缀和+枚举(?)】
- 口胡【NOIP2011DAY1】选择客栈
- Noip2011 提高组 选择客栈
- [NOIP2011] 提高组 洛谷P1311 选择客栈
- [NOIP2011](提高组)D1 T2 选择客栈
- NOIP 2011 提高组 选择客栈(vijos 1737)(方法:队列,数学)
- NOIP2011 day1 选择客栈
- NOIP2011提高组(选择客栈)
- [NOIP2011]选择客栈【前缀和,贪心】
- Luogu P1311 [NOIp提高组2011]选择客栈
- noip2011提高组——选择客栈
- NOIP2011(DAY1)解题报告(C/C++)(铺地毯)(选择客栈)(Mayan 游戏)
- Noip 2011 解题报告 Day1 (铺地毯,选择客栈,Mayan 游戏)
- NOIP&nbsp;2011&nbsp;提高组第一试&nbsp;选择客栈