1547E——Air Conditioners(codeforces)

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.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值