头歌:药剂稀释

任务描述

本关任务:找出一个序列中的最长下降子序列其中的元素个数。

医院里有一种药剂,其可以稀释成不同的浓度供病人使用,并且对于已知浓度的该药剂,使用时只能稀释不能增加浓度。

由于这种药需求量较大,同一瓶药剂只能给某个病人以及排在他后面的若干人使用。不同的病人对药物的浓度要求可能不同。

现在为了最大限度的利用每一瓶药剂(不考虑容量),已知n个病人所需药物浓度的序列,请计算出一瓶药剂能最多使用的人数。

编程要求

在右侧编辑器中有一个函数Cal,它有两个参数arrn

arr中包含n个病人对药物浓度的要求。

请你在这个函数中补充代码,计算并输出一瓶药剂能最多使用的人数。

输入数据由评测系统读取,并传递给Cal函数。具体见测试说明

测试说明

平台会对你编写的代码进行测试:

测试输入: 6 0.7 0.9 0.6 0.8 0.8 0.4

预期输出: 4

每组输入有两行,第一行有一个数n,第二行的n个数为数组的内容。


开始你的任务吧,祝你成功!

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

// 定义函数 Cal,用于计算浓度递增的最长子序列的长度
void Cal(double arr[], int n)
{
    // 定义数组 m 用于保存以每个元素结尾的最长子序列的长度
    int m[n], max = 0; // max 用于保存最长子序列的长度
    
    // 从数组末尾向前遍历
    for (int i = n - 1; i >= 0; i--)
    {
        m[i] = 1; // 初始时,以每个元素结尾的最长子序列长度至少为 1,因为单个元素也是一个子序列
        
        // 从当前元素的右边开始向右遍历
        int k = i + 1; // k 始终为当前枚举 i 右边的一瓶药
        while (k < n)
        {
            // 如果当前元素的浓度大于等于右边药品的浓度,则可以将右边药品加入子序列
            if (arr[i] >= arr[k])
            {
                m[i] = m[i] > m[k] + 1 ? m[i] : m[k] + 1; // 更新以当前元素结尾的最长子序列的长度
            }
            k++;
        }
        
        // 更新最长子序列的长度
        max = max > m[i] ? max : m[i];
    }
    
    // 输出最长子序列的长度
    printf("%d", max);
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值