【字符串处理·新定义表达式(括号处理·递归)·思维】Kvalitetni--7.2测试 COCI

本文主要是介绍【字符串处理·新定义表达式(括号处理·递归)·思维】Kvalitetni--7.2测试 COCI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

样例
2
10 6
((?)+(?))6.000003
2 5 3
(((?)+(?))*(?))6.000003
2 10 6
((?)*(?)*(?))8.000000000

分析

首先,我们可以发现,这个问题是可以递归的(大多数表达式都可以递归),递归到最小的子问题的话,这个什么质量表达式本质上有三类:
( A ) (A) (A)
( A 1 + A 2 + … + A k ) (A1+A2+…+Ak) (A1+A2++Ak)
( A 1 ∗ A 2 ∗ … ∗ A k ) (A1*A2*…*Ak) (A1A2Ak)

第一种 就让它的值为 Z 1 Z1 Z1,就是最大的嘛

对于第二种和第三种 由于递归处理 我们先让每个数为他最大的值(递归本来就在干这件事)然后再来考虑限制的问题

第二种 我们就要考虑一下满足这 k k k个数之和不超过 Z k Zk Zk,也比较好处理 因为是求和,而本身限制就是和要小于等于 Z k Zk Zk 答案就是 m i n ( Z k , A 1 + A 2 + … + A k ) min (Zk,A1+A2+…+Ak) minZk,A1+A2++Ak

第三种,是最不好处理的
首先,我们要尽可能不减小这些数,也就是说,这些数的和也要尽量保持最大 同上,我们也还是知道这 k k k个数之和,为 m i n ( Z k , A 1 + A 2 + … + A k ) min(Zk,A1+A2+…+Ak) minZk,A1+A2++Ak
可是我们要求的是乘积的最大值,又知道了和为一个定值,就可以用均值不等式得出:
k k k个数相等的时候乘积就最大
可是我们不能暴力地把每一个数都变成 s u m / k sum/k sum/k
因为有的数的最大值 A i Ai Ai本身小于 s u m / k sum/k sum/k,取不到 s u m / k sum/k sum/k
我们就要让这些数尽量接近 s u m / k sum/k sum/k,也就是取到它自己的最大值 A i Ai Ai
但是呢
要注意的是 这些数取了 A i Ai Ai之后,其它数就不能再取原来的 s u m / k sum/k sum/k 因为:这个数既然确定,我们就去掉它;去掉这一个数之后剩下的那些数要再取乘积最大,显然之前的 s u m / k sum/k sum/k已经不是剩下那些数的均值 使他们乘积最大的均值应该还要大一些(去掉了一个较小数

所以我们就要重新求这个均值:把取了 A i Ai Ai的数去掉,再求剩下的数的均值

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
#include<vector> 
using namespace std;
#define LL long long
#define MAXN 1000005
#define INF 0x3f3f3f3f
int k;
int z[55],p[MAXN];
char s[MAXN];
stack<int>S;
double work(int l,int r)
{if(l+2==r) return (double)z[1];//只有一个数,先把它搞成最大,然后再考虑符不符合Sum<=z[k] bool f;//1: + ; 0: *vector<double>V;//当前这个区间包含的数 for(int i=l+1;i<r;i++){if(s[i]=='+') f=1;if(s[i]=='*') f=0;if(s[i]=='('){V.push_back(work(i,p[i]));i=p[i];//跳到下一个递归区间 }}double ans;if(f){//处理连+的情况 ans=0;for(int i=0;i<V.size();i++)ans+=V[i];ans=min(ans,(double)z[V.size()]);}else{ans=1;sort(V.begin(),V.end());double sum=z[V.size()];//最大的和 for(int i=0;i<V.size();i++){//尽量取到平均值 如果取不到那么大 小的数就尽量取大 然后平均值就会变化 double tmp=sum/(V.size()-i);if(V[i]>=tmp)//如果最小的那一堆数取不到平均水平,就尽可能接近平均水平 sum-=tmp,ans*=tmp;else sum-=V[i],ans*=V[i];}}return ans;
}
int main()
{freopen("kvalitetni.in","r",stdin);freopen("kvalitetni.out","w",stdout);scanf("%d",&k);for(int i=1;i<=k;i++)scanf("%d",&z[i]);scanf("%s",s+1);int len=strlen(s+1);for(int i=1;i<=len;i++){if(s[i]=='(')S.push(i);if(s[i]==')'){int pos=S.top();S.pop();p[pos]=i;//记录左括号对应的右括号位置 }}printf("%.3f\n",work(1,len));return 0;
}

这篇关于【字符串处理·新定义表达式(括号处理·递归)·思维】Kvalitetni--7.2测试 COCI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/375045

相关文章

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚