旅行者问题

【问题描述】

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

【Solution】

  虽然A了但还是很想吐槽,这题竟然是个数学问题...

  首先先枚举每条可能的第一条路。对于某一种可能的第一条路,其余点的排列方式有(n-1)!种,所以这条路对所有以这条路为起点的路径的贡献和为(n-1)*dist[i]。

  对于某一条路i--j,其余(n-2)个点的排列方式有(n-2)种,而这条路可以插入的位置有n-1种,所以这条路对所有带这条路的路径的贡献和为(n-2)!*(n-1)*abs(dist[i]-dist[j])=(n-1)!*abs(dist[i]-dist[j])。

  根据以上两种情况,路径和=

  现在的问题就是怎么求加号后面的那一坨了。

  我们将dist从大到小排序,排序后忽略的情况在最后求出路径和乘二即可。用S[i]表示到i的所有路程和。我们发现:

  S2 = dist[1] - dist[2]

  S3 = dist[1] - dist[3] + dist[2] - dist[3] = (dist[1] - dist[2] + dist[2] - a3) + dist[2] - dist[3] = S2 + 2 *(dist[2] - dist[3])

  S4 = dist[1] - dist[4] + dist[2] - dist[4] + dist[3] - dist[4] = (dist[1] - dist[3] + dist[3] - dist[4]) + (dist[2] - dist[3] + dist[3] - dist[4]) + (dist[3] - dist[4]) = S3 + 3 * (dist[3] - dist[4])

  不难看出,S[i]可以由递推求出,递推式为S[i]=S[i-1]+(i-1)*(dist[i-1]-dist[i])。虽然式子里还要乘个(n-1)!,但是由于分子为n!,约一下分母上的(n-1)!消掉了,分子变成n,求个gcd分子分母一除输出答案就行了。

  AC代码:

 #include <cstdio>
#include <algorithm>
using namespace std;
int N;
int dist[];
long long sum,ans;
long long recs[];
void input(){
scanf("%d",&N);
for(int i=;i<=N;++i) scanf("%d",&dist[i]);
}
int cmp(const int a,const int b){
return a>b;
}
long long gcd(long long x,int y){
long long ys=;
while(ys!=){
ys=x%y;
x=y;
y=ys;
}
return x;
}
int main(){
input();
for(int i=;i<=N;++i) sum+=dist[i];
sort(dist+,dist++N,cmp); recs[]=dist[]-dist[];
for(int i=;i<=N;++i)
recs[i]=recs[i-]+(i-)*(dist[i-]-dist[i]);
for(int i=;i<=N;++i) ans+=recs[i];
ans=ans*+sum;
long long k=gcd(ans,N);
printf("%I64d %I64d",ans/k,N/k);
return ;
}

【NOIP模拟赛】【数学真奇妙】【递推】旅行者问题的更多相关文章

  1. noip 模拟赛 After 17(递推+特殊的技巧)

    来源:Violet_II T1 好神的一题,我竟然没做出来QAQ 首先我们发现,答案是sigma(x[i]*x[j], i>j)+sigma(y[i]*y[j], i>j).显然只需要讨论 ...

  2. [wikioi 1418]铃仙•优昙华院稻叶(东方幻想乡系列模拟赛)(树上递推)

    题目:http://www.wikioi.com/problem/1418/ 分析: 一看就肯定是树上的递推 设f[i][j][k]表示第i秒在k点(从j点走过来的)的概率 则f[i][j][k]=f ...

  3. 2017-9-22 NOIP模拟赛[xxy][数论]

    XXY 的 的 NOIP 模拟赛 4 4 —— 数学专场 A Description定义 f(x)表示 x 的约数和,例:f(12)=1+2+3+4+6+12=28给出 x,y,求Σf(i),i∈[x ...

  4. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  5. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  6. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  7. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  8. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  9. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  10. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

随机推荐

  1. zedboard zynq 学习 sobel 边缘检测 IP核 制作 根据 文档 Xapp890

    官方文档http://www.xilinx.com/support/documentation/application_notes/xapp890-zynq-sobel-vivado-hls.pdf ...

  2. IPV4的地址是如何分类的?网络号的范围分别是多少?

    1. A类地址 (1)A类地址第1字节为网络地址,其它3个字节为主机地址. (2)A类地址范围:1.0.0.1—126.255.255.254 (3)A类地址中的私有地址和保留地址: ① 10.X.X ...

  3. 基于linux操作系统安装、使用redis详解

    服务端安装 Redis的官方下载站是http://redis.io/download,可以去上面下载最新的安装程序下来,我写此文章时的的稳定版本是2.6.11. 步骤一: 下载Redis 进入软件安装 ...

  4. [HNOI2015][bzoj4009] 接水果 [整体二分+扫描线]

    题面 传送门 思路 本题其实有在线做法......但是太难写了,退而求其次写了离线 基本思路就是,考虑一个盘子以及它能接到的所有水果 可以发现,这个水果的端点一定在这个盘子两端的"子树&qu ...

  5. spring in action 学习笔记六:bean在不同情况下的默认id号或者将名字

    bean如果不知名id是什么它一般都有一个id或者讲名字. 第一种情况:组件扫描的情况:默认的id号或者bean的name是类名的首字母小写. 代码如下: package com.qls.beanli ...

  6. linux下有的目录有可执行权限

    在linux里面,目录也是一个文件.权限设置方法与普通文件一样.目录的可执行权限:目录无所谓执行不执行,目录只能否被开启(也称作“遍历”或“搜索”)对目录的执行权限不仅意味着查看目录下文件名还允许查看 ...

  7. 用Java画QRCode二维码

    支付宝.微信扫码支付的二维码,第三方的类库QRCode.jar 还是很好用的.下面贴出来这个东东生成二维码的代码. 使用时注意包括图片地址.编码内容.图片属性等几个参数,支付宝的它们的扫码回调地址. ...

  8. [ CodeVS冲杯之路 ] P1014

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1014/ 一道不用考虑价值的DP题,那么我们可以用 0 和 1 表示是否能够达到该步骤 #include<cstd ...

  9. unicode ascii 互转 函数 C实现 MultiByteToWideChar/WideCharToMultiByte 详解

    void Ascii2UnicodeLen(char*src,int len,unsigned short*tar) { unsigned int word_cnt; word_cnt=MultiBy ...

  10. 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑

    看到知乎上有个关于linux多进程.多线程的讨论:http://www.zhihu.com/question/19903801/answer/14842584 自己项目里也对这个问题有过很多探讨和测试 ...