题目描述
原题地址:COGS
一句话题意:二维的分组背包
DP方程
状态定义
令$f(i,j,k)$为在前$i$个箱子中取药,使得生命值为$j$,精神值为$k$ 。
令第$i$瓶药造成的生命值伤害是$pain(i)$,精神伤害是$san(i)$,痛苦值为$suff(i)$。
阅读全文注意到$a,b\leq 60$,所以预处理出所有$x^a,y^b$存起来,然后两两求和,去重, 然后处理一下得到答案。
开unsigned long long
while (num <= 1e18)
num = num * x
这样写是不符合基本法的,会溢出掉的
阅读全文问题:题目地址
Vladik often travels by trains. He remembered some of his trips especially well and I would like to tell you about one of these trips:
Vladik is at initial train station, and now n people (including Vladik) want to get on the train. They are already lined up in some order, and for each of them the city code $a_i$ is known (the code of the city in which they are going to).
计算$a^b\mod m$,其中$0\leq a,b\leq10^{16}$。
我们可以写出如下的暴力求幂程序,复杂度$O(n)$:
typedef long long ll;
ll pow_mod(ll a,ll b,ll m)
{
ll ans=1;
while(b--)
ans=(ans*a)%m;
return ans;
}
不过注意到对于任意正整数k,我们都可以拆成至多$log k$个二进制下的1,所以我们可以计算出$a^{2^0},a^{2^1},a^{2^2},\cdots$(可以递推出来),然后再用$\log b$次乘法将其合并起来,复杂度为$O(\log n)$,代码如下:
ll fast_pow_mod(ll a,ll b,ll m)
{
ll ans=1;
while(b)
{
if(b&1)
ans*=a;
a*=a;
b>>=1;
}
return ans;
}
由于$a\times b$可能溢出,因此不能直接乘起来再取膜,考虑到一个事实: $$ a^b= \begin{cases}
1 & b=0 \\
\underbrace { a \times \cdots \times a }_b & b \ge 1
\end{cases}
$$
$$
a\times b=
\begin{cases}
0&b=0
\underbrace{a+\cdots+a}_b&b\not=0
\end{cases}
$$
所以我们把上面的代码稍微改一改就好了:
★★☆
输入文件:zootopia.in 输出文件:zootopia.out 简单对比
时间限制:1 s 内存限制:32 MB
你需要帮他制定一个使多层蛋糕总体积最大的方案。
你只需要计算出最大的总体积即可。 注意:两个半径相同的蛋糕不能放在一起
第一行一个整数n,
接下来n行,第i+1行两个整数R,H分别表示编号为i的蛋糕的半径和高度。
只有一行一个整数,为最大总体积,由于出题人懒得写评测插件,你需要精确到小数点后2位
此题乍一看是普通的最长上升/下降子序列,然而$O(n^2)$的做法会挂掉,所以要用$O(nlogn)$的做法
阅读全文