2022年庐阳区青少年信息学科普日真题- 特别的电梯(lift)

题目描述 Description

爸爸公司的大厦,在早高峰期,几乎每层都有人上下,电梯每层都停,大家被弄的很不耐烦,阳阳提出一个解决办法:每次电梯从一层往上走时,只允许电梯停在其中的某一层,所有乘客从一楼上电梯,到达某一层后,电梯停下来,所有乘客再从这里走楼梯到自己的目的楼层。为了对要去的某一个楼层人数计数,电梯的按钮做了特殊的改造,每个人上电梯按一下自己所要去的楼层,电梯可以统计目标楼层的人数。我们要给电梯编写一个附加特别程序,根据大家再一楼按下的目的楼层,计算电梯应该停在某层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。求这个最小值。

输入描述 Input Description

第一行,一个正整数N,表示需要到达的目标楼层的数。
以下N行,每行两个整数,分别表示要到达的目标楼层和需要到达目标楼层的人数。

输出描述 Output Description

一个整数,意义如题所述。

样例输入 Sample Input

5 5 4 8 10 20 3 19 9 2 2

样例输出 Sample Output

159

数据范围及提示 Data Size & Hint

数据范围
1<=N<=100000
提示说明
N个乘客只会从一楼进入电梯,进入电梯后必须等到电梯停在某一层才会出电梯,若有需要,再爬楼梯到达自己的目标楼层。

解析:

这道题,我的第一印象是求解转判定+二分优化,但我觉得过于麻烦了

后来,我在博客里转了一圈,没有找到满意的题解

然后

数学,平均数,中位数!

我灵机一动,写出了中位数写法

int pos=a[n/2+1];//中位数 就是停留层数最优解

code:

#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[100005];
long long sum;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
    cin>>a[i];
}
sort(a+1,a+n+1);
int pos=a[n/2+1];//中位数 就是停留层数最优解
for(int i=1;i <= n;i++){
    sum+=abs(a[i]-pos);
}
cout << sum;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值