[In progress]前缀max算法练习 pre-max

https://dmoj.ca/problem/dmpg17b5

https://dmoj.ca/problem/dmopc19c5p4

这个题目要找排序最低的,但是钞能力要足够被打劫的人。因为sub case很多,所以要把钞能力提前算出来,每个case分别用二分进行查找。

使用二分的一个前提条件就是函数的单调性,如果不是单调的,就不能使用二分。

题目给出的测试数据,把每个人的钞能力排序后得到的数是2 3 6 6 7,这样满足单调性,程序调试成功。

但是给一个不满足单调性的测试,就不能简单使用二分了,需要对钞能力取pre max,这样就能满足单调性,可以使用二分了

这些人的排序如下:

10 80 5 20 10 40

0 0 1 1 2 0

那么调整过的钞能力就是10 80 15 30 90 40,不能二分,但是取pre max就可以了10 80 80 80 90 90

    for (int i=1;i<n;i++){
        pmax[i]=m[i];
        if(v[i]!=0){
            pmax[i]+=pmax[v[i]-1];
        }
        pmax[i]=max(pmax[i],pmax[i-1]);
    }

https://dmoj.ca/problem/aac1p6

https://dmoj.ca/problem/dmopc20c3p4

https://dmoj.ca/problem/dmopc20c4p4

https://dmoj.ca/problem/dmopc23c1p4

https://dmoj.ca/problem/dmopc16c3p6

https://dmoj.ca/problem/ceoi19p2

https://dmoj.ca/problem/stp3

https://dmoj.ca/problem/dmopc20c1p6

评论

Leave a Reply