【NOIP2017】人生的叹息

Description

眨眼间,那额外的一百年时光也过完了,NiroBC走到了人生的尽头。
NiroBC又一次在死亡面前老泪纵横。
NiroBC渴望着那个戴着黑色方框眼镜,方脸,穿着高腰裤的长者能够再一次出现,然而并没有。NiroBC不禁叹息。
我不能就这样死去!人生中还有那么多冲突没有解决!
NiroBC的人生可抽象成一个数列a[1..N],她需要总结自己的人生,便需要给自己的人生划分阶段。现在定义一段人生a[l..r]的冲突值是
【NOIP2017】人生的叹息_第1张图片

其中最外面的[]表示,若里面的布尔表达式为真,则值为1,否则值为0。冲突值实际上就是相等的数的对数。

现在NiroBC老眼昏花,她显然不能把人生划分成太多的片段,否则大脑会转不过来。当然每一段的冲突值不能太大,因为NiroBC有精神洁癖。

NiroBC躺在病床上写不了程序,所以她让你写程序把a[1..N]划分成尽量少的片段,且每一段的冲突值都<=K。

Solution

第一眼看到这道题就觉得是贪心,但是发现这道题放在了第三题,而且时限开到了2s,让我有点虚,不过对拍过后还是对的。很明显的一个思想,若是同一个分段内能容纳更多的数,显然分段的长度更小的概率大,所以用O(n)的扫描判断就可以了。

Code

var
    t,a:array[0..500001] of longint;
    n,i,j,ans,x,last:longint;
    k,sum,tot:int64;
begin
    readln(n,k);
    ans:=1;last:=1;
    for i:=1 to n do
    begin
        read(x);
        sum:=sum+t[x];
        a[i]:=x;
        if sum>k then
        begin
            sum:=0;inc(ans);
            for j:=i-1 downto last do dec(t[a[j]]);
            last:=i;
        end;
        inc(t[x]);
    end;
    writeln(ans);
end.

你可能感兴趣的:(NOIP,贪心)