用c++代码解决如下问题:一个金矿总共有g克黄金。总共有t秒的时间挖金矿。一开始你手头上没有黄金,你每一秒可以挖1克黄金。你也可以雇佣工人帮你挖金,每个工人每1秒可以挖1克黄金。你必须一次性支付c克黄金给1个工人,该工人才会帮你挖金。工人所挖到的黄金最后全部归属你。工人有无限多。假如你用最优的方法挖金,你最终可以赚到多少克黄金。多组测试数据。 输入格式:第一行,一个整数k,表示有k组测试数据,1<=k<=5。 每组测试数据格式: 一行,3个整数:g,t,c。1<=g<=10^18, 1<=t<=10^6, 1<=c<=10^18。输出格式:共k行,每行一个整数。
时间: 2024-02-10 19:10:30 浏览: 217
好的,下面是使用动态规划求解该问题的C++代码:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e6 + 10;
typedef long long LL;
LL dp[N];
int main()
{
int T;
cin >> T;
while (T--)
{
LL g, t, c;
cin >> g >> t >> c;
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= t; i++)
dp[i] = i * 1LL;
for (int i = 1; i <= g; i++)
{
for (int j = t; j >= 1; j--)
{
if (j >= c)
dp[j] = max(dp[j], dp[j - c] + 1);
}
}
cout << dp[t] << endl;
}
return 0;
}
```
其中,dp[i]表示用i秒钟所能挖到的最大黄金量,初始化为i。然后从1到g枚举每一个金矿,从t到1倒序更新dp数组,这样可以确保在更新dp[j]时,dp[j-c]中的dp值已经是更新过的。
代码中使用了一维数组dp,可以避免二维数组开销较大的问题。
阅读全文