#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool check(vector<int>& a, int n, int S, int T, double target){
double sum = 0;
double max_avg = 1e-9;
queue<int> q;
for(int i = 0; i < n; i++){
sum += a[i];
q.push(a[i]);
if(q.size() > T){
sum -= q.front();
q.pop();
}
if(q.size() >= S){
double avg = sum / q.size();
max_avg = max(max_avg, avg);
}
}
return max_avg >= target;
}
double binarySearch(vector<int>& a, int n, int S, int T){
double left = 0;
double right = 1e6;
while(right - left >1e-6){
double mid = left + (right - left)/2;
if(check(a, n, S, T, mid)){
left = mid;
}
else right = mid;
}
return left;
}
int main(){
int n, S, T;
cin >> n >> S >>T;
vector<int> a(n);
for(int i = 0; i < n; i++){
cin >> a[i];
}
double avg = binarySearch(a, n, S, T);
printf("%.3lf\n", avg);
return 0;
}
全红了
考虑的是每一段的平均价值。你的判断程序只有在队列长度超过最大限制时才会弹出元素,但是如果队头是一个很小的元素的话,可能更早把它弹出会更合理。所以你的这个思路是不行的。建议使用单调队列来求限定区间的最大值
计算平均值时可能会出现除以0的情况,因为队列的大小可能会为0。为了避免这种情况,可以在计算平均值之前先判断队列的大小是否为0,如果为0则跳过计算平均值的步骤。例如,可以在check函数中加入以下代码:
if(q.size() == 0){
continue;
}
这样就可以避免除以0的情况了。
【blank】空格
【sign】正负号
【digit】数字
【dot】小数点
【e】幂符号
这个代码看了很久才明白,空讲无用,下面以数值类型【-1.2E-16】和非数值型【1a.3.14】为例讲解一下代码的执行流程
【-1.2E-16】,首先for(char c: s.toCharArray())
使用foreach遍历输入的字符串
第一位符号是【-】,被判断为正负号类型也就是【s】
接着将判断出的类型【s】在哈希表states[P](初始时P=0)中查找
发现对应的键值为1,并将P设置为这个对应的键值1
接下来就是不断地重复:判断确定符号类型,并将P设置为States[P]中对应的键值
当循环结束时,发现P落在7上,也就是说,【-1.2E-16】满足2、3、7、8这四种合法情况中的一种,返回true
【1a3.14】,一样的操作,不过,遍历到字符【a】时判断发现它不是合法的类型,直接返回false
/*
* 状态0:起始的空格
* 状态1:幕符号之前的正负号
* 状态2:小数点之前的数字--------------------------合法
* 状态3:小数点之后的数字--------------------------合法
* 状态4:当小数点前为空时,小数点后的数字
* 状态5:幕符号
* 状态6:幂符号之后的正负号
* 状态7:幂符号之后的数字--------------------------合法
* 状态8:结尾的空格-------------------------------合法
*/
class Solution {
public boolean isNumber(String s) {
Map[] states = {
//' '空格
//'s'正负号
//'d'数字
//'.'小数点
//'e'幂符号
new HashMap<>() {{
put(' ',0);put('s',1);put('d',2);put('.',4);
}},new HashMap<>() {{
put('d',2);put('.',4);
}},new HashMap<>() {{
put('d',2);put('.',3);put('e',5);put(' ',8);
}},new HashMap<>() {{
put('d',2);put('e',5);put(' ',8);
}},new HashMap<>() {{
put('d',3);
}},new HashMap<>() {{
put('s',6);put('d',7);
}},new HashMap<>() {{
put('d',7);
}},new HashMap<>() {{
put('d',7);put(' ',8);
}},new HashMap<>() {{
put(' ',8);
}}
};
int p = 0;
char t;
for(char c: s.toCharArray()) {
if(c>='0' && c<='9')
t = 'd';//为数字
else if(c=='+' || c=='-')
t = 's';//为正负号
else if(c=='e' || c=='E')
t = 'e';//为幂符号
else if(c=='.' || c==' ')
t = c;//为空格或者小数点
else
t = '?';//非法元素
//containsKey方法检查hashMap中是否存在指定的key对应的映射关系
if(!states[p].containsKey(t))
return false;//比如:如果t为'?',不在states[p]中,就会直接返回false
p = (int)states[p].get(t);//将p设为t键对应的值
}
return p==2||p==3||p==7||p==8;
}
}
虽然明白了自动机的执行原理,但代码的重点【状态转移表】却还是不知道如何构建
最近要写一个自动生成算式的程序,这两天可以试试构建一个关于四则运算式的【状态转移表】,并把自动机实现
由于提供的参考资料与问题描述不相关,无法提供解决方案。请重新提供问题描述及相关参考资料。