蓝桥杯 游览计划 (Python实现)
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千米处,所有景点都位于起点一侧。
八云紫(咦这是怎么中枪的?)从起点出发,每次任选一个没有游览的景点,从当前位置出发到达那个景点游览,这样进行n次,直到停在最后游览的那个景点。(最后不会回到起点。)
在x千米处的点与在y千米处的点的路程为|x-y|千米。八云紫平均的总游览路程是多少?(她选择所有游览路线的概率是相等的,你可以认为这个概率等于1/n!。)
输入格式
第一行一个数n,第二行n个数A1, A2 ... An,如题目所述。
输出格式
输出一行,两个数,答案的分子和分母。要求分子分母不能再约分。
样例输入
3
2 3 5
样例输出
22 3
数据规模和约定
2<n<100000,1≤Ai<10^7,对于任意1≤i<n,都有Ai<A(i+1)。
样例说明
可能的游览顺序与对应的总路程:
[2, 3, 5]: |2 – 0| + |3 – 2| + |5 – 3| = 5;
[2, 5, 3]: |2 – 0| + |5 – 2| + |3 – 5| = 7;
[3, 2, 5]: |3 – 0| + |2 – 3| + |5 – 2| = 7;
[3, 5, 2]: |3 – 0| + |5 – 3| + |2 – 5| = 8;
[5, 2, 3]: |5 – 0| + |2 – 5| + |3 – 2| = 9;
[5, 3, 2]: |5 – 0| + |3 – 5| + |2 – 3| = 8.
平均路程:(5+7+7+8+9+8)/6 = 22/3。
本题乍一看,似乎要计算很大的数字又或是要循环很多次。但是其实拆解一下就会发现其实很简单没那么复杂(关键是拆解绝对值的时候找规律)。
首先,我们可以把以上所有绝对值的和看成两类,一类是a[i]之间相减(例如3 - 2, 5 - 3), 另外一类是与原点的距离(例如2 - 0, 3 - 0)。计算算第一类的时候,我们发现其实有很多的重复的量,比如说3 - 2和2 - 3,去绝对值后都是一样的,所以我们先去其中的不重复的一组,然后再计算有多少相同的组即可。拿出一组来分析时,容易想到第一个数在计算的时候要被后面的所有的数减一遍(数组按顺序排列,所以第一个数一定是最小的,取绝对值的时候前面一定是负号),而最后的一个数也要减去前面所有的数一遍,这个时候我们就有了(n - 1)a[n], 和负的(n - 1)[a[1],前面的系数都是n - 1。继续,到a[2], 这时会有一个a[2] - a[1], 以及a[i] - a[2](2 < i <= n), 所以会减掉n - 3 个a[2], 同理会加上n - 3个a[n - 1]......,依次类推可以得到所有的和s1。
再来看有多少个s1,其实也就是看当两个数凑在一起的时候有多少种排列方式。比如样例中的3,5两个点,只要这两个点在游览的时候是紧接着的,就一定会有一个5 - 3出现,而且此时5和3可以调换位置(因为要取绝对值)。而由排列组合的知识知道两个数紧挨在一起时的排列方式有(n - 1) ! 种(也就是n - 1个元素进行全排列),而再加上可以调换顺序还需要乘以2,则第一类的和为2(n - 1) ! s1。
接下来第二类就很容易了,首先看样例很容易发现2 - 0,3 - 0, 5 - 0 都有两个,实际上只要固定一个数在第一个,而后有几种排列方式就有几个a[i] - 0(1<= i <= n), 也就是有几倍数列的和,计算一下便知道有(n - 1)!种排列,也就是s2 = (n - 1)! * sum(a)。注意到没有?s = s2 + 2(n - 1) ! s1 = (n - 1)! (sum(a)+2s1).
而总的排列方式为n!,一除就只剩下了一个n(都含有一个(n - 1) ! ), 而分子就只剩下了(sum(a)+2s1)。大功告成!至于怎么得到最后的结果,也就是化简到不能再约分。只要把每一个数除以最大公约数即可。接下来上代码:
def simplify(a, b):while a % b:t = a % ba, b = b, treturn bn = int(input().rstrip())
a = [int(i) for i in input().rstrip().split(' ')] # 表示每一个景点的位置
s2, s1, count = sum(a), 0, 0 # count用来表示元素的下标
for i in range(n - 1, -1, -2): # 步长为2,(下限设置为0也可以,加上一个0等于没加)s1 += i * (a[n - 1 - count] - a[count])count += 1
x, f = 2 * s1 + s2, n # 直接利用推导的结论
m = simplify(x, f)
print(x // m, f // m)
蓝桥杯 游览计划 (Python实现)相关推荐
- 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑
题目链接 Ideas 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑 Code Python if __name__ == '__main__':n = int(input( ...
- 蓝桥杯龟兔赛跑预测Python(超详细!!)
蓝桥杯龟兔赛跑预测Python 问题描述(简单描述) 龟兔赛跑,跑道长l米,如果兔子比乌龟快t米,兔就会停下来休息s秒,有一者到达终点则停止比赛. 兔子速度为v1,乌龟速度为v2,输入v1.v2.t. ...
- 2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解
2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解 文章目录 2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解 试题 F:时间显示 题目描述 输入描述 输出描述 输入输出 ...
- 蓝桥杯算法(python)
蓝桥杯第三级别--算法. 蓝桥杯的考察重点:加黑重点 (括号内了解) 算法:枚举.排序.搜索.计数.贪心.动态规划.图论.数论.博弈论.概率论.计算几何.字符串算法.(递归.二分查找.哈希算法.分治算 ...
- 第十三届蓝桥杯省赛 python B组复盘(三道代码题全AC居然省一了)
第十三届蓝桥杯省赛 python B组复盘(三道代码题全AC居然省一了)
- 蓝桥杯 日志统计 Python
蓝桥杯 日志统计 Python 一.题目 输入格式 输出格式 样例输入 样例输出 二.Python代码 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一.题目 小明维护着一个程序员论坛.现在他 ...
- 第十三届蓝桥杯省赛python(B组)赛后总结
前言:这次蓝桥杯比赛,我获得了python组的二等奖(下图中最后一行是我,差几名拿省一).其实能获得这个成绩也算意料之外,情理之中吧.赛前也挺迷茫,自己到底能不能获奖,已经大三下了,还要准备考教资,找 ...
- 2020年软件类第十一届蓝桥杯 省赛 python组(人生苦短,我用python)
2020年软件类第十一届蓝桥杯 省赛 python组 题解 文章目录 2020年软件类第十一届蓝桥杯 省赛 python组 题解 试题 A: 门牌制作 试题 B: 寻找 2020 试题 C: 跑步训练 ...
- 蓝桥杯 分巧克力 python
蓝桥杯 分巧克力 python 题目标题 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见, ...
最新文章
- SSE4.1和SSE4.2 Intrinsics各函数介绍
- Java面试题及答案整理(2022最新版) 持续更新
- 第一次作业:艰难的计算机之路
- string::size_type
- Asp.net高效导出excel篇之Aspose导出excel
- bzoj 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富(DP)
- html5 datalist 选中option选项后的触发事件
- Jenkins 部署 jmeter + Ant
- x[:,n]或者x[n,:]的用法
- TSC TTP-244 Pro标签打印机安装说明
- 对DSP的基本了解(二)--DSP的软硬件环境
- 第五章 课后习题(P139-140)
- 【数论】整除分块(数论分块)
- 原生js制作扫雷-自定义难度
- 相机计算坐标公式_相机采样点的坐标转换方法与流程
- 手机号码段及归属地查询规则
- 2021年美容师(初级)考试总结及美容师(初级)考试试题
- MOXA串口服务器6450串口引脚图
- android arouter原理和作用,ARouter原理剖析
- X射线掠入射聚焦反射镜