Air Conditioner Codeforces 1304C

题目链接: Air Conditioner

大致题意

有一家饭店, 初始时温度为m. 有n个客人, 第i个客人将会在t时刻到来, 他喜欢的温度为[l, r].
每一时刻, 我们可以选择饭店升温1度, 或者降温1度, 或者维持当前温度.

问: 能否让这n个客人到来的时候, 饭店温度都是他们喜欢的温度.

解题思路

首先我们分析一下, 对于某个客人, 如果当前的饭店温度已经是他喜欢的温度, 那么我们是否需要调整温度, 可以暂时认为取决于下一个客人. 如果下一个人要求的温度相对于更低一点, 则我们需要把温度尽可能调低. 但是调到多低, 这也是我们需要考虑的问题. 经过初步一分析, 会感觉很乱.

我们应该侧重于去考虑我们可以调控的温度区间, 而不是去考虑某一时刻, 我们应当把当前的温度保持在多少.

对于初始时刻, 房间温度为m, 在t1时刻, 第一个客人来到时, 我们假设已经保证第一个客人是可以被满足的.
①如果m∈[l1, r1], 那么我们可以下调温度down = min(m - l1, t1), 或者上调温度up = min(r - m, t1).
②如果m > r1, 说明此时温度过高了, 那么我们看看能否在t1时间内将温度变为r1. 若可以, 由于客人到来的时间为一个时刻, 因此我们可以在客人到来后立马在改变温度, 因此我们也应记录类似于情况①的一组down和up. 那么此时可以调控的down = min(r - l, t1 - (m - r)), up = 0, 完成后, 应有m = r.
③如果m < l1, 说明此时温度过低, 相似于情况②.

那么对于第二个客人到来的时候, 我们此时可调温的范围为: 下调: down + (t2 - t1), 上调: up + (t2 - t1). 我们发现, 如果认为初始时刻up = 0, down = 0 那么其实每次的调温是可以推广的.

详细见代码QAQ (公式我不好打, 你们也不好看懂).

AC代码

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
int main()
{
    int T; cin >> T;
    while (T--) {
        int n, m; scanf("%d %d", &n, &m);
        
        bool flag = 1; //表示答案
        int last = 0, up = 0, down = 0; //last记录上一个客人到来的时间
        rep(i, n) {
            int t, l, r; scanf("%d %d %d", &t, &l, &r);
            
            int can = t - last; //表示当前客人与上一个客人到来时间的时间差. 即:我们可以改变的温度差
            if (m >= l && m <= r) { //当前客人已经感觉舒服了
                //注意: 对于当前时刻, 可以改变的温度不要只计算can, 还有上一时刻残留的up与down.
                up = min(r - m, can + up), down = min(m - l, can + down);
            }
            else if (m > r) { //温度过高
                //have为可以变化的温度值, need为需要变化的温度值
                int have = down + can, need = m - r; 
                if (have < need) flag = 0;
                
                m = r;
                up = 0, down = min(r - l, have - need);
            }
            else { //温度过低
                int have = up + can, need = l - m;
                if (have < need) flag = 0;

                m = l;
                down = 0, up = min(r - l, have - need);
            }
            last = t;
        }
        
        printf("%s\n", flag ? "YES" : "NO");
    }
    return 0;
}

感觉思维题好难讲明白QAQ. 希望大佬们都能看懂.

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值