一位神级大大说:这题不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=