标签: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))));
}
标签:code 最大 www. 考试 sum 变量 最大的 lin 就是
原文地址:https://www.cnblogs.com/Qihoo360/p/9690891.html