9.22总结

Posted qihoo360

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.22总结相关的知识,希望对你有一定的参考价值。

今天上午是考试。。
(T1) 购物
贪心,然而我并没有想出来,写了个错误的时间复杂度极高的贪心,水了40分。
如果可选面值里没有(1),显然是无解的,否则一定有解。
定义一个变量(sum)表示当前已经能拼出的最大面额,初始为(0)
然后

while(sum < x){
    for(int i = n; i; --i)
        if(sum + 1 >= a[i]){
          sum += a[i];
          break;
        }
        ++ans;
}

如果当前拼不出下一个数,就找到最大的小于等于下一个数的面额(a[i]),那么显然(sum+a[i])以内都是可以拼出了的,因为(sum)以内是已经确定可以拼出的了,所以(a[i]+1,a[i]+2,...,a[i]+sum)都是可以拼出的了。

(T2) 养猪
并没有想到这是一个背包。。仍然贪心乱搞,不记得多少分了。
如果体重不会减少,这显然就是个裸的(01)背包,但这里体重会减少,也就是说每件物品的价值不是恒定不变的。
关于为什么不能直接跑(01)背包,个人觉得这是个有思维难度的问题,因此,我找到一篇讲的比较好的博客
(P)值降序排列,然后跑(01)背包就好了。因为体重减少快的先取显然更优。

(T3) 数位平方和
看到题目给的函数就想到肯定存在环,直接照着题目写函数的话显然是会无限递归的。这个环上所有数的函数值是一样的,于是想到记忆化。体重(k)的最大值为(6),也就是说(S(x))的最大值为(7*9^6)(H)还要更小,显然能直接用数组存下。
于是就有

int H(int x){
    if(h[x]) return h[x];
    if(vis[x] >= 2)
      return 1000000000;
    vis[x]++;
    return h[x] = min(x, min(S(x), H(S(x))));
}

以上是关于9.22总结的主要内容,如果未能解决你的问题,请参考以下文章

9.22“月饼杯”递归算法欢乐赛测试报告总结

机房测试9.22

9.22 正睿提高4

java学习笔记9.22(泛型)

python常用代码片段总结

BootStrap有用代码片段(持续总结)