本文主要是介绍头歌:药剂稀释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
任务描述
本关任务:找出一个序列中的最长下降子序列其中的元素个数。
医院里有一种药剂,其可以稀释成不同的浓度供病人使用,并且对于已知浓度的该药剂,使用时只能稀释不能增加浓度。
由于这种药需求量较大,同一瓶药剂只能给某个病人以及排在他后面的若干人使用。不同的病人对药物的浓度要求可能不同。
现在为了最大限度的利用每一瓶药剂(不考虑容量),已知n
个病人所需药物浓度的序列,请计算出一瓶药剂能最多使用的人数。
编程要求
在右侧编辑器中有一个函数Cal
,它有两个参数arr
和n
。
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);
}
这篇关于头歌:药剂稀释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!