用了比较朴素的模拟写的,不是最优解,但是能过。本质思想就是根据“最大”“最小”来将未知数据改成具体的最优数据,附上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;
}