Air Conditioners
Now it is 10:50 am on July 20,2021.I came to Shenyang to participate in 45th ICPC Regional Competition Shenyang.At the same time,I was honored to get the iron plate.(Attention,is Iron).
And now I can’t express my feeling in words.
All right, without further ado,let’s to the problem.
题目大意:给定一个长度为n的数组,表示有n个房间,其中n个房间里面有k个房间里面有空调,并且给出空调的温度,让你求每个房间里面的最小温度是多少,温度计算公式是,该房间到某空调房(k个中的某一个)的距离加上空调的温度。(即|i-j|+ti)
思路: 其实仔细想想不难发现,在求每个房间的温度的时候其实存在递推关系。我们不妨先从前往后看(即从1~n),那么我当前房间的最小温度应该是前一个房间的最小温度+1,或者是前一个房间的温度+1,或者是我们房间自身的温度(注意,前一个房间的温度和前一个房间的最小温度不是同一回事,最小温度我们用f[i]表示,而它的温度用a[i]表示)。同理,我们再从后往前看(即从n ~ 1),那我们当前房间的最小温度应该是后一个房间的最小温度+1,或者是前一个房间的温度+1,或者是我们当前空调房自身的温度。
从前往后看:
转移方程: f[i]=min(f[i],f[i-1]+1),f[i]=min(f[i],a[i-1]+1),f[i]=min(f[i],a[i])
从后往前看:
转移方程: f[i]=min(f[i],f[i+1]+1),f[i]=min(f[i],a[i+1]+1),f[i]=min(f[i],a[i])
初始化:
for(int i=0;i<=n+1;i++)
{
f[i]=INT_MAX-100;
a[i]=INT_MAX-100;
}
我们在读入之前初始化,如果一个房间没有空调那么我们就认为这个房间的温度为正无穷,(注意这里不要初始化成INT_MAX,因为在转移的时候如果+1的话就会爆int变成负数,可以自行体会)。
AC代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
using namespace std;
const int N=300010;
int f[N],a[N],b[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<=n+1;i++)
{
f[i]=INT_MAX-100;
a[i]=INT_MAX-100;
}
for(int i=1;i<=k;i++)scanf("%d",&b[i]);
for(int i=1;i<=k;i++)scanf("%d",&a[b[i]]);
for(int i=1;i<=n;i++)//状态转移
{
f[i]=min(f[i-1]+1,f[i]);
f[i]=min(a[i-1]+1,f[i]);
f[i]=min(f[i],a[i]);
}
for(int i=n;i>=1;i--)
{
f[i]=min(f[i+1]+1,f[i]);
f[i]=min(a[i+1]+1,f[i]);
f[i]=min(f[i],a[i]);
}
for(int i=1;i<=n;i++)printf("%d ",f[i]);
puts("");
}
return 0;
}
由于我是蒟蒻,所以代码比较复杂,其实上述代码完全可以简化,请读者自行简化。
Stay away from you.