洛谷1419 我的代码哪里有问题


#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的情况了。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7566015
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:在有序数组中,统计某一元素出现的次数
  • 除此之外, 这篇博客: 04.表示数值的字符串中的 有限状态自动机 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 【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;
        }
    }
    

    虽然明白了自动机的执行原理,但代码的重点【状态转移表】却还是不知道如何构建

    最近要写一个自动生成算式的程序,这两天可以试试构建一个关于四则运算式的【状态转移表】,并把自动机实现

  • 您还可以看一下 林礼晓老师的行政文员转型初级产品经理第一季课程中的 前言介绍小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    由于提供的参考资料与问题描述不相关,无法提供解决方案。请重新提供问题描述及相关参考资料。