首页 > 其他分享 >鱼塘钓鱼问题

鱼塘钓鱼问题

时间:2024-03-30 15:24:48浏览次数:23  
标签:get int res 钓鱼 鱼塘 问题 ++ spend

这题目给了三种做法,两种是动态规划做法,一种是贪心加枚举,还有一种是堆写法,这可以促进我对动态规划的理解,所以在此贴出四种板子,并且给出解释
第一种做法,自下二上更新

第二种做法,自上而下更新

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int a[N], b[N], c[N], presum[N];
int t, f[2][1010];
int main() {
#ifndef ONLINE_JUDGE
    freopen(".in", "r", stdin);
#else
    ios::sync_with_stdio(0);
#endif
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    for (int i = 1; i <= n; ++i)
        cin >> b[i];
    for (int i = 2; i <= n; ++i) {
        cin >> c[i];
        presum[i] = c[i] + presum[i - 1];
    }
    cin >> t;
    n = lower_bound(presum + 1, presum + 1 + n, t) - presum - 1;
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        memset(f[i & 1], 0, sizeof f[0]);
        for (int j = presum[i] + 1; j <= t; j++) {
            f[i & 1][j] = f[(i - 1) & 1][j - c[i]];
            int sum = a[i];
            for (int k = 1; k <= min((a[i] + b[i] - 1) / b[i], j - presum[i]); k++) {
                f[i & 1][j] = max(f[i & 1][j], f[(i - 1) & 1][j - k - c[i]] + sum);
                sum += a[i] - k * b[i];
            }
            ans = max(ans, f[i & 1][j]);
        }
    }
    cout << ans;
}
第三种做法,枚举加多路归并
点击查看代码
//多路归并:如何归并
//T - l[i]:余下可以调度时间
//for i 1 -n
//  T = T - li;
//  res = work(i,T);
//work(n,T)
//在序列第一层 比较大小 选出最大 
//for j 1 - n
//  if(get(j) > get(t))
//      t = j;
//  res += get(j);//选出最大 n次后返回
//  spend[t]++;//在这里钓鱼分钟++
//结果看着好像是一个鱼塘一直掉了spend[i]分钟
//其实是n次判断结果

//1-i 剩余时间不同  多路归并m次选择 n次比较出最大++  o(n * m * n)
///if(get(j)>get(t)) t = j选出n个里面最大 spend[t]++;//在该处时间++
//get(k): a[k] - d[k] * spend[k];
//
//过程像来回 实际是帮我们选择每个鱼塘应该待多少时间
//
#include<bits/stdc++.h>
#define N 110
using namespace std;
int spend[N],a[N],d[N],x[N];
int get(int k)
{
    //开始鱼塘k钓鱼数 - 鱼塘k每分钟减少数 * k鱼塘掉了多少分钟
    return max(0,a[k] - d[k] * spend[k]);
}
int work(int n,int T)
{
    memset(spend,0,sizeof spend);

    int res = 0;//i T - x[i] 钓鱼数
    for(int i = 0;i<T;i++) //T次选择
    {
        int t = 1;//默认从一个开始钓  
        for(int j =1;j<=n;j++)//找出该次最大
        {
            if(get(j) > get(t))
                t = j;
        }    
        res += get(t);//当前行最大钓鱼数
        spend[t]++;//选择t序列钓鱼时间++
    }
    return res;
}
int main()
{
    int n,m,T;
    scanf("%d",&n);
    for(int i = 1;i<=n;i++) scanf("%d",&a[i]);
    for(int i = 1;i<=n;i++) scanf("%d",&d[i]);
    for(int i = 2;i<=n;i++) 
    {
        scanf("%d",&x[i]);
        x[i] += x[i-1];
    }
    // for(int i = 1;i<=n;i++)
    // {
    //     printf("a[%d]:%d\nd[%d]:%d\nx[%d]:%d\n",i,a[i],i,d[i],i,x[i]);
    // }
    scanf("%d",&T);
    int res = 0;
    for(int i = 1;i<=n;i++)
    {
        res = max(res,work(i,T-x[i]));

    }
    cout<<res<<"\n";
}
第四种做法,堆写法
点击查看代码
//多路归并:如何归并
//T - l[i]:余下可以调度时间
//for i 1 -n
//  T = T - li;
//  res = work(i,T);
//work(n,T)
//在序列第一层 比较大小 选出最大 
//for j 1 - n
//  if(get(j) > get(t))
//      t = j;
//  res += get(j);//选出最大 n次后返回
//  spend[t]++;//在这里钓鱼分钟++
//结果看着好像是一个鱼塘一直掉了spend[i]分钟
//其实是n次判断结果

//1-i 剩余时间不同  多路归并m次选择 n次比较出最大++  o(n * m * n)
///if(get(j)>get(t)) t = j选出n个里面最大 spend[t]++;//在该处时间++
//get(k): a[k] - d[k] * spend[k];
//
//过程像来回 实际是帮我们选择每个鱼塘应该待多少时间
//
#include<bits/stdc++.h>
#define N 110
using namespace std;
int spend[N],a[N],d[N],x[N];
int get(int k)
{
    //开始鱼塘k钓鱼数 - 鱼塘k每分钟减少数 * k鱼塘掉了多少分钟
    return max(0,a[k] - d[k] * spend[k]);
}
int work(int n,int T)
{
    memset(spend,0,sizeof spend);

    int res = 0;//i T - x[i] 钓鱼数
    for(int i = 0;i<T;i++) //T次选择
    {
        int t = 1;//默认从一个开始钓  
        for(int j =1;j<=n;j++)//找出该次最大
        {
            if(get(j) > get(t))
                t = j;
        }    
        res += get(t);//当前行最大钓鱼数
        spend[t]++;//选择t序列钓鱼时间++
    }
    return res;
}
int main()
{
    int n,m,T;
    scanf("%d",&n);
    for(int i = 1;i<=n;i++) scanf("%d",&a[i]);
    for(int i = 1;i<=n;i++) scanf("%d",&d[i]);
    for(int i = 2;i<=n;i++) 
    {
        scanf("%d",&x[i]);
        x[i] += x[i-1];
    }
    // for(int i = 1;i<=n;i++)
    // {
    //     printf("a[%d]:%d\nd[%d]:%d\nx[%d]:%d\n",i,a[i],i,d[i],i,x[i]);
    // }
    scanf("%d",&T);
    int res = 0;
    for(int i = 1;i<=n;i++)
    {
        res = max(res,work(i,T-x[i]));

    }
    cout<<res<<"\n";
}

标签:get,int,res,钓鱼,鱼塘,问题,++,spend
From: https://www.cnblogs.com/wl511/p/18105526

相关文章

  • 线程的安全问题
    目录导言:正文:1.共享资源:2.非原子操作:3.执行顺序不确定:4.可见性:5.死锁和饥饿:6.指令重排序:总结:导言:线程安全是并发编程中的一个重要概念,它指的是在多线程环境下,对共享数据的访问和修改不会导致数据的不一致或其他不可预料的结果。在Java中,线程安全问题通常涉及到共......
  • 解决在 VS Code 中无法自动导入 QApplication 类的问题
    起因在尝试使用VSCode来开发PySide6应用时,发现输入下面的代码时,没有触发Pylance的自动导入功能。app=QApplication()我期望的:#自动导入fromPySide6.QtWidgetsimportQApplication结果:什么都没有发生解决方法这个问题其实已经有人向Pylance扩展的开发者反......
  • 【洛谷】P1049 装箱问题
    P1049装箱问题确认所需算法题目链接:P1049装箱问题通过看标签得知这题是一道背包问题,如果你还不知道什么是背包问题,那么请看我这篇文章既然我们知道了这道题是一道背包问题,那么下一步我们要确认他是01背包还是完全背包。首先我们回顾01背包和完全背包的区别:通过题意可知,每......
  • Vue父组件拿到接口的数据,并把数据传给子组件的问题;同时,父组件数据更新,子组件同样拿到
    参考文档:https://blog.csdn.net/qq_33723676/article/details/128143924问题一:父组件向子组件传值,子组件拿到的是空数据。在vue中,有时需要在父组件页面调用接口时,并把数据传给子组件。一般的做法中,子组件拿不到父组件传过来的值。原因是什么捏???原因就是:父组件跟子组件获取数据是......
  • Java面试必问题22:如何创建线程池(偏重点)&&创建线程池的注意事项
    企业最佳实践:不要使用Executors直接创建线程池,会出现OOM问题,要使用ThreadPoolExecutor构造方法创建,引用自《阿里巴巴开发手册》【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽......
  • Java面试必问题21:线程池核心参数
    publicThreadPoolExecutor(intcorePoolSize,                        intmaximumPoolSize,                        longkeepAliveTime,                        TimeUnitunit,        ......
  • Vuex的核心组成、版本问题及store.js的使用、 Vuex中存值、取值以及获取变量值、异步
    Vuex的核心组成、版本问题及store.js的使用、Vuex中存值、取值以及获取变量值、异步同步操作和Vuex后台交互  //store//初始值//设置值mutations  ---this.$store.commit('setDemoValue方法名',value); //更新值action --this.$store.disp......
  • MES系统怎么解决车间生产调度难的问题?
    MES系统三个层次1、MES决定了生产什么,何时生产,也就是说它使公司保证按照订单规定日期交付准确的产品;2、MES决定谁通过什么方式(流程)生产,即通过优化资源配置,最有效运用资源;3、MES提供在什么时间已生产什么以及其他生产一线信息,以帮助后台管理系统ERP等进行进一步的分析。车......
  • 基于深度学习的OCR,如何解决图像像素差的问题?
    基于深度学习的OCR技术在处理图像像素差的问题时确实面临一定的挑战。图像像素差可能导致OCR系统无法准确识别文本,从而影响其精度和可靠性。尽管已经有一些方法如SRN-Deblur、超分SR和GAN系列被尝试用于解决这个问题,但效果并不理想。然而,这并不意味着这个问题无解。以下是一......
  • 京东一面挂在了CAS算法的三大问题上,痛定思痛不做同一个知识点的小丑
    写在开头在介绍synchronized关键字时,我们提到了锁升级时所用到的CAS算法,那么今天我们就来好好学一学这个CAS算法。CAS算法对build哥来说,可谓是刻骨铭心,记得是研二去找实习的时候,当时对很多八股文的内容浅尝辄止,很多深奥的知识点只是知道个概念,源码看的也不深,代码量也不够,京东一......