2016.10.15【初中部 NOIP提高组 】模拟赛C

来源:互联网 发布:java 连续登录天数 编辑:程序博客网 时间:2024/05/16 10:57

现在才AK,我的心啊……


T1:

题目大意:

两头公牛之间至少有有k头奶牛的组合有多少种?

dp.

设f[i]表示到前i头牛能组成的方案数.

分类讨论:

对于i<=k,则不可能放两只公牛,公牛放一只有i种,不放公牛也算一种,合起来就是i+1种

对于i>k,可以放n多只公牛,那么很明显,如果第i个为母牛,则方案数为f[i-1],若放公牛则方案数为f[i-k-1](这样子才能去重)



T2:

题目大意:

给你一堆计算公式,让你求一个最终的最优值。

分析:

注意,这些计算公式有一个特点,那就是根据下标的位置来计算的。

没看懂题的就可以ctrl+w了……

那么,设一个最容易想到的状态:

f[i,j]表示前i个数选j个数的最优值,且第i个必选。

则对于前i个数,因为计算值与下标有关,所以我们还需枚举一个下标k,前k个数的值可以直接通过状态值求出。

而k+1到i-1需要计算得出值,设为sum(这也需要个循环)

f[i,j]=min{sum+f[k,j-1]}


这样就可以求解最优值了.

注意当我们对状态f[i,j]是否为最优值时,对于i+1到n的还要再算出来,这些也是需要费用的,费用也很容易算出来,直接按照公式第三步按部就班就Ok了.

时间复杂度将近O(n^4)


当然,还可以优化时间.

不先枚举个数j,先枚举k,然后求一个区间的值,记为sum,则可以为O(n³)

T3:

显然对于两种下车的奶牛(a,b),(c,d),若c>a,d<b,则如果车满的话肯定踢掉a,b

按照此思路然后用个邻接表求一下好了

具体取法如下:

如果当前前面上车的奶牛数为x,现在需要上车的奶牛加上x大于了总载量,则肯定先载到满之后在看余下的是否能代替一些牛。


T4:

连负边,走一遍spfa,注意:如果某一个点经过的次数“过多”就是出现了负环,输出无解即可。


0 0
原创粉丝点击