POJ 1701 Dissatisfying Lift (数学推导,枚举)

本文探讨了POJ 1701题目的解决方案,涉及数学推导和枚举方法。通过计算不同楼层停留时的不满意度d[p],包括常数项s1、与楼层相关的s2和不满意度系数s3,确定电梯停在何处能使总不满意度达到最小。算法复杂度为O(n),并提供了计算每层不满意度的递推公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目意思:
m层楼,每层i楼有 K[i] 个住客,电梯只能停留在某一层,然后所有的住客,由该楼层走楼梯回家。
加入走楼梯的的层数为N,上楼的不满意度 为 a * N + .05 * N * (N - 1), 下楼的则为
b* N + .05 * N * (N - 1)。题目问,电梯停留在那一层的不满意度总和最小。

参考网上老哥的公式推导 https://ishare.iask.sina.com.cn/f/avsXq1tzeSc.html
本题要点:
1、d[p] 表示电梯停留在p层的不满意度
比较 d[p + 1] 和 d[p] 的差值,分解为三部分
第一部分:s1 = sum{1 * K[1], 2 * K[2], …, n * K[n]}, 这部分是常数值
第二部分:用数组 s2[MaxN] 存储,假设电梯停留在p层
s2[p] = (b + p) * sum{K[1], K[2], … , K[p]}
第三部分:用数组 s3[MaxN] 存储, 假设电梯停留在p层
s3[p] = (a - p - 1) * sum{K[p + 1], K[p + 1], … , K[n]}

d[p + 1] - d[p] = -s1 + s2[p] - s3[p]
d[p + 1] = d[p] + -s1 + s2[p] - s3[p]	//递推公式

2、先计算 s1, 复杂度 O(n);
同理数组 s2, s3, 复杂度也是 O(n);
先计算 电梯停留在一层的 d[1], 利用递推公式可以计算每一层 的 不满意度d[p],
记录最小值即可

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 10010;
int Test, n, a, b;
long long K[MaxN];
long long s1, k_sum;
long long sumi[MaxN];
long long s2[MaxN];
long long s3[MaxN]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值