两种二进制优化,一种30分,一种AC,请问为什么
  • 板块P1833 樱花
  • 楼主lzy20091001
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/8 21:23
  • 上次更新2023/11/3 05:06:01
查看原帖
两种二进制优化,一种30分,一种AC,请问为什么
932039
lzy20091001楼主2023/8/8 21:23

AC:

#include <iostream>
#include <algorithm>
using namespace std;

int n, maxt, t[10005], c[10005], p[10005];
long long dp[1005];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int h1, m1, h2, m2;
    char tmp;
    cin >> h1 >> tmp >> m1 >> h2 >> tmp >> m2 >> n;
    maxt = h2 * 60 - h1 * 60 + m2 - m1;
    for (int i = 1; i <= n; i++)
        cin >> t[i] >> c[i] >> p[i];
    for (int i = 1; i <= n; i++)
    {
        if ((p[i] == 0) || (t[i] * p[i] >= maxt))
            for (int j = t[i]; j <= maxt; j++)
                dp[j] = max(dp[j], dp[j - t[i]] + c[i]);
        else
            for (int x = 1; p[i] > 0; x <<= 1)
            {
                int tmp = min(x, p[i]);
                for (int j = maxt; j >= tmp * t[i]; j--)
                    dp[j] = max(dp[j], dp[j - tmp * t[i]] + tmp * c[i]);
                p[i] -= tmp;
            }
    }
    cout << dp[maxt] << "\n";
    return 0;
}

30分:

#include <iostream>
#include <algorithm>
using namespace std;

int n, maxt, t[10005], c[10005], p[10005];
long long dp[1005];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int h1, m1, h2, m2;
    char tmp;
    cin >> h1 >> tmp >> m1 >> h2 >> tmp >> m2 >> n;
    maxt = h2 * 60 - h1 * 60 + m2 - m1;
    for (int i = 1; i <= n; i++)
        cin >> t[i] >> c[i] >> p[i];
    for (int i = 1; i <= n; i++)
    {
        if ((p[i] == 0) || (t[i] * p[i] >= maxt))
            for (int j = t[i]; j <= maxt; j++)
                dp[j] = max(dp[j], dp[j - t[i]] + c[i]);
        else
        {
            int tmp = 1;
            while (tmp <= p[i])
            {
                for (int j = maxt; j >= tmp * t[i]; j--)
                    dp[j] = max(dp[j], dp[j - tmp * t[i]] + tmp * c[i]);
                tmp <<= 1;
            }
            tmp >>= 1;
            for (int j = maxt; j >= (c[i] - tmp) * t[i]; j--)
                    dp[j] = max(dp[j], dp[j - tmp * t[i]] + tmp * c[i]);
        }
    }
    cout << dp[maxt] << "\n";
    return 0;
}

2023/8/8 21:23
加载中...