码迷,mamicode.com
首页 > 其他好文 > 详细

9.22总结

时间:2018-09-22 21:29:55      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:code   最大   www.   考试   sum   变量   最大的   lin   就是   

今天上午是考试。。
\(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总结

标签:code   最大   www.   考试   sum   变量   最大的   lin   就是   

原文地址:https://www.cnblogs.com/Qihoo360/p/9690891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!