Summary
今天比赛感觉题目很奇葩,都可以用许多简单方法来做,正确性都显然,当然也有点水,也就是说是考我们的数感和数学知识,而程序,只是代码的体现。
这次的时间安排感觉不错,因为很快就打完最后一道题了,后面的时间都在思考前面两道题
Problem
T1 护花
题目大意
牛都跑出去了,FJ想要把他们抓回来。抓每只牛需要2*Ti分钟的时间,每只牛在没有被要抓回去时,每分钟吃Di棵花,问怎么样抓牛才能使被吃掉的花尽量少。
想法
本来我是想设一个动态规划,F[i,j]表示第i头牛,是第j只被抓的,然后用堆等数据结构来维护。
但是,有后效性,而且不确保在此之前,是否有出现过的j。
比赛时只好打了一个递归。
但是,就在草稿本上,惊奇的发现了个东西:
例如:
第一头牛 Ti:a Di:b
第二头牛 Ti:c Di:d
如果设先选第一头牛更优,那么有如下不等式
2cb<2ad
b/a<d/c.........通过某些转化得到
也就是说,两只的情况下要满足这个条件。由特殊到一般,再试3,4的可以发现,其实就是求Di/Ti的序列(排序的),然后模拟一次就行了
这道题有很好的草稿本技巧!
T2 最高的奶牛
题目大意
FJ有N(1 <= N <= 10,000)头奶牛,编号为1到N,站成一条直线。每头奶牛自己的身高(正整数,秘密未知),告诉你最高奶牛的身高H及位置I,同时告诉你R(0 <= R <= 10,000)组信息,每组信息由两个数ai,bi组成,表示奶牛ai可以看到奶牛bi,这就意味着奶牛bi的身高至少和奶牛ai的身高一样高,同时奶牛ai到奶牛bi之间的奶牛身高必须低于奶牛ai
现在要你求出每头奶牛最高可能的高度,保证有解。
想法
这道题不知道为什么可以这么做,感觉很神奇。
设a,b是可以互相看到的两头牛,然后只要a,b在之前没有出现过,就把a+1~b-1内的数减一就行了,初始值为最高的奶牛高度。
T3 最高的奶牛
题目大意
给出一段数,求这段数最大值减最小值是多少。
想法
线段树来维护区间最大值最小值就可以了。当然RMQ也可以。