全部RE
  • 板块P1833 樱花
  • 楼主FASTergood
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/9 17:01
  • 上次更新2024/5/9 19:56:09
查看原帖
全部RE
1168588
FASTergood楼主2024/5/9 17:01

惨案,全部RE

#include<iostream>  
#include<algorithm>  
#include<climits> // 包含 INT_MIN  
using namespace std;

int v[1005], w[1005], f[10005], t, s[1005]; // 假设总时间不会超过 100000 分钟  

int main()
{
    int m, n, i, j, h1, m1, h2, m2;
    scanf("%d:%d", &h1, &m1); // 使用 scanf 而不是 scanf_s  
    scanf("%d:%d", &h2, &m2);
    t = (h2 - h1 + (h2 < h1 ? 24 : 0)) * 60 + m2 - m1; // 处理跨天的情况  
   
    cin >> m;

    // 初始化 f 数组为 INT_MIN  
    fill(f, f + 100005, INT_MIN);
    f[0] = 0; // 初始时间为 0 时,价值为 0  

    for (int i = 1; i <= m; i++)
    {
        cin >> v[i] >> w[i] >> s[i];
        if (s[i] == 0) s[i] = INT_MAX / v[i]; // 防止除以零,并设置一个较大的倍数  
    }

    for (int i = 1; i <= m; i++)
        for (int j = t; j >= v[i]; j--) // 从后往前遍历,确保每个 f[j-v[i]] 都是有效的  
        {
            int maxTimes = min(s[i], j / v[i]); // 确保不超出时间限制和 s[i] 的限制  
            for (int k = 1; k <= maxTimes; k++) // 可能需要选择多次这个物品  
            {
                int cost = k * v[i];
                if (cost <= j)
                    f[j] = max(f[j], f[j - cost] + k * w[i]);
            }
        }

  
  
   cout << f[t] << endl;

    return 0;
}
2024/5/9 17:01
加载中...