博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP考前模拟赛】纯数学方法推导——旅行者问题
阅读量:6722 次
发布时间:2019-06-25

本文共 2935 字,大约阅读时间需要 9 分钟。

一、写在前面

这题似乎是一道原创题目(不是博主原创),所以并不能在任何OJ上评测,博主在网盘上上传了数据(网盘地址:),诸位看官需者自取。另外博主使用此题并没有获得出题人授权,如果出题人看到这篇blog并认为在下侵犯了您的权利,请用站内消息与在下联系,在下会立即删除这篇blog,给您带来的困扰之处敬请谅解。

博主上传这道题主要是因为这题牵扯许多数学运算,推导过程比较复杂,但是却没有用到任何算法或者数学定理,可以说这是一道想法题的典范。本篇blog中介绍的方法为博主原创,转载请标明出处。

二、题目

题目描述

lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行。lahub想去参观n个目的地(都在一条直道上)。lahub在起点开始他的旅行。第i个目的地和起点的距离为ai千米(ai为非负整数)。不存在两个目的地和起点的距离相同。

从第i个目的地走到第j个目的地所走的路程为 |ai-aj|千米。我们把参观n个目的地的顺序称作一次“旅行”。lahub可以参观他想要参观的任意顺序,但是每个目的地有且只能被参观一次(参观顺序为n的排列)。

lahub把所有可能的“旅行”都写在一张纸上,并且记下每个“旅行”所要走的路程。他对所有“旅行”的路程之和的平均值感兴趣。但是他觉得计算太枯燥了,所以就向你寻求帮助。

输入

第一行一个正整数n。

第二行n个非负整数a1,a2,....,an(1≤ai≤10^7)。

输出

两个整数,答案用最简分数形式输出,第一个为分子,第二个为分母。

样例输入

3

2 3 5

样例输出

22 3

样例提示

样例有6种可能的旅行:

[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.

答案为 1/6 * (5+7+7+8+9+8)=44/6=22/3

数据范围

30% n<=10

50% n<=1000

100% n<=100000

三、题目分析

首先,我们不妨抛开题目背景,将题目大致翻译成一个数学题:

给出一个正整数n,并给出a1、a2……an共n个互不相同的正整数。对于序列an的每一种排列ax1、ax2……axn,令Sx=|ax1-0|+|ax2-ax1|+……+|axn-axn-1|,求S的平均数。

由于题目明确说明,当i≠j时,不存在ai=aj的情况。那么,排列的总情况数就为n的全排列即n!种。

为了便于讲解,我们规定序列an严格升序(代码实现时只需要做一次sort处理)

通过对S的定义我们不难发现,若不考虑ai作为axn的情况,对于每个i,在每个求S的算式中,ai都会作为被减数和减数各出现一次。此外,由于当i=xn时,ai在算式中不作为减数出现,并且对于每个i,i=xn的情况各有(n-1)!种,所以对于每个i,ai总共作为被减数出现n!次,作为减数出现[n!-(n-1)!]次。

我们先讨论ai作为被减数出现的情况:

当ai作为被减数时,0和其余n-1个数都可以作为ai的减数,且他们成为ai的减数的机会是均等的(ai雨露均沾??)所以含0在内的n个数各会作为ai的减数(n-1)!次。设aj为ai的减数,那么当且仅当j<i时,|ai-aj|去绝对值符号后会得到ai-aj;反之,当且仅当j>i时,|ai-aj|去绝对值符号后会得到aj-ai。由于当i合法时,0总比ai小,所以我们可以得到有i个数使ai去绝对值符号之后带正号,n-i个数使ai去绝对值符号后带负号。

以上,我们整理后得到:ai作为被减数时对ΣS的影响为:

同理,我们讨论ai作为减数出现的情况:

当ai作为减数时,其余n-1个数都可以作为ai的被减数,且他们成为ai的被减数的机会是均等的(ai雨露均沾+1)所以其余n-1个数各会作为ai的减数(n-1)!次(想一想,为什么)。设aj为ai的被减数,那么同上,当且仅当j<i时,|aj-ai|去绝对值符号后会得到ai-aj;反之,当且仅当j>i时,|aj-ai|去绝对值符号后会得到aj-ai。所以我们可以得到有i-1个数使ai去绝对值符号之后带正号,n-i个数使ai去绝对值符号后带负号。

以上,我们整理后得到:ai作为减数时对ΣS的影响为:

综合以上两种情况,我们得到:ai对ΣS的影响为:

最后,我们只需要将每个ai对ΣS的影响结合起来,便得到了答案:

注意:1、记得将答案化简为最简分数后输出(分子、分母各除以其最大公约数);

    2、不开long long见祖宗,十年OI一场空。

四、代码实现

1 #include
2 #include
3 using namespace std; 4 const int MAXN=100010; 5 long long a[MAXN]; 6 long long gcd(long long x,int n) 7 { 8 long long xx=x,yy=n; 9 while(yy)10 {11 long long t=xx%yy;12 xx=yy;13 yy=t;14 }15 return xx;16 }17 int main()18 {19 freopen("tourist.in","r",stdin);20 freopen("tourist.out","w",stdout);21 int n;22 long long x=0;23 scanf("%d",&n);24 int i;25 for(i=1;i<=n;++i)26 scanf("%d",&a[i]);27 sort(a+1,a+1+n);28 for(i=1;i<=n;++i)29 x=x+a[i]*(4*i-2*n-1);30 long long g=gcd(x,n);31 printf("%lld ",x/g);32 printf("%d\n",n/g);33 fclose(stdin);34 fclose(stdout);35 return 0;36 }
旅行者问题

弱弱地说一句,本蒟蒻码字也不容易,转载请注明出处

转载于:https://www.cnblogs.com/Maki-Nishikino/p/5994679.html

你可能感兴趣的文章
神州数码不同OSPF进程及区域间的通信 实例
查看>>
RHEL AS4下升级oracle10g到10.2.0.3
查看>>
图说:如何给Metro 开始屏幕图标分组
查看>>
HAProxy负载平衡集群
查看>>
junit4使用 (转http://blog.csdn.net/afeilxc/article/details/6218908 )
查看>>
电脑蓝屏--代码0x0000008E
查看>>
mysql主从配置(freebsd+mysql5.5.13)
查看>>
开启win7远程桌面
查看>>
使用fir.im和蒲公英进行测试的一些注意事项
查看>>
我的友情链接
查看>>
Yellow dog
查看>>
Python网络编程之协程
查看>>
趣学Python之弹球游戏第二阶段--向上运动
查看>>
过滤全文验证正则表达式的一个小程序
查看>>
Cacti的spine进程数引起的问题
查看>>
我的友情链接
查看>>
求一份oracle数据库实习、兼职的工作
查看>>
storm集群的监控
查看>>
Connector|OIM向IBM TDS推送账号(LDAP3)
查看>>
Linux例行性工作at,cron,进程管理
查看>>