用了比较朴素的模拟写的,不是最优解,但是能过。本质思想就是根据“最大”“最小”来将未知数据改成具体的最优数据,附上ac代码,已写注释,希望对你有帮助

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+9;
const int max_=5e8;//max_表示最大值,-1*max_表示最小值
signed main()
{
    int day,x;
    cin>>day>>x;
    int i,resmax=0,resmin=0,num;
    int arr[N],brr[N];//arr用于模拟最大数量时的天气,brr用于模拟最小数量时的天气
    
    for(i=1;i<=day;i++)
    {
        cin>>num;
        if(num==-999999999&&i==1)//如果第一天就未知,就让两个用于模拟的数组分别取最大最小值
        {
            arr[i]=max_;//由于需要模拟最大,那就让这一天的温度为最大值
            brr[i]=-1*max_;//与上一行同理
        }
       else  if(num==-999999999&&i!=1)//如果不是第一天且未知
        {
           //先模拟最大值的
            if(arr[i-1]-x<-1*max_)//如果上一天不能再降了就将今天设定为最大值
                arr[i]=max_;
            else 
                arr[i]=arr[i-1]-x;//还能降就将今天设定为刚好将x度
           
           //再模拟最小值的
            if(brr[i-1]-x+1<-1*max_)//如果上一天降了x度刚好到-1*max_或者小于,那就让温度最低
                brr[i]=-1*max_;
                else brr[i]=brr[i-1]-x+1; //如果不是,那就让今天的温度等于上一天的减去x再加一  
        }
        else //如果温度已知那就正常存入
        {
            arr[i]=num;
            brr[i]=num;
        }
    }
    
    
    for(i=2;i<=day;i++)//对两个数组按照题意判断就可以了
    {
        if(arr[i-1]-arr[i]>=x)
            resmax++;
        if(brr[i-1]-brr[i]>=x)
            resmin++;
    }
    cout<<resmax<<" "<<resmin;
    return 0;
}