旅行者问题

【问题描述】

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

分析:

这道题的不免会让人想起用DFS搜下去。打出来个全排列出来。为了全排列可能还用预处理两点之间的位置。不过。做这些事情。恩。还是给WA了。

而这道题再进一步思考呢?会让人想到。如果,只是对每条边进行一个处理呢?思考--->每条边(两个点之间的距离)对最终的答案的影响。那么如果我们走了这条边,我们接下来会有多少种路可以走呢,也就是接下来有多少种组合呢? 假设我们选择了Ai 与 Aj 这条路,接下来就会有(n-2)!种方案。那么Ai与Aj这条路就会走(n-2)!次。而这条路又有(n-1)种选择。因为我们可以选择在什么时候再走。这个时候方案数就又多了。是 (n-2)!*(n-1) ==(n-1)!。但是我们光枚举了两点之间的距离,没有枚举从起点开始的路径。而从头开始的路径的位置是固定的。假设我们从0到Ai。那么走完之后就有(n-1)!种方案。/-乘法原理-/。这样每次的情况又枚举完了。乘上权值就是我们最后的总和。

最关键的就是我们如何去枚举整个sum(abs(A[i]-A[j]);首先,我们可以确定的是。我们就只用计算从i到j 并且 (i>j)这样计算,总路程就×2就好(走过去,走回来)。

我们可以用递推来实现整个计算。我们可以发现一个规律:

假设a1 > a2 > a3 > a4,

以Ai为结尾的Ai-Aj的和为Si,

那么:

S2 = a1 - a2

S3 = a1 - a3 + a2 - a3 = (a1 - a2 + a2 - a3) + a2 - a3 = S2 + 2 *(a2 - a3)

S4 = a1 - a4 + a2 - a4 + a3 - a4 = (a1 - a3 + a3 - a4) + (a2 - a3 + a3 - a4) + (a3 - a4)

= S3 + 3 * (a3 - a4)

我们发现这里的S是可以递推的。

最后在计算结果的时候 分子是总和。而分母是总方案数n! 分数相约之后。分母就只剩一个n。那么我们就只需要计算gcd再同时除以gcd。

放出代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int line[1000001];
int n;
long long int gcd(long long int a,long long int b)
{
return a%b==0 ? b : gcd(b,a%b);
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
freopen("tourist.in","r",stdin);
freopen("tourist.out","w",stdout);
long long int sum=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&line[i]);
sum+=line[i];
}
sort(line+1,line+1+n,cmp);
long long int k=0,ans=0;
for(int i=2;i<=n;++i)
{
k=k+(i-1)*(line[i-1]-line[i]);
ans+=k;
}
sum+=ans*2;
long long int c=gcd(sum,n);
printf("%I64d %I64d",sum/c,n/c);
fclose(stdin);
fclose(stdout);
return 0;
}

NOIP模拟赛-旅行者问题 解题报告的更多相关文章

  1. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  2. nowcoder(牛客网)提高组模拟赛第一场 解题报告

    T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...

  3. nowcoder(牛客网)普及组模拟赛第一场 解题报告

    蒟蒻我可能考了一场假试 T1 绩点 这题没什么好说的,应该是只要会语言的就会做. T2 巨大的棋盘 一个模拟题吧qwq,但是要注意取模的时候先加上n或者m再取模,要不然会错的. #include< ...

  4. NOIP模拟2017.6.11解题报告

    T1: 水题: 代码: #include <cstdio> #include <iostream> #include <algorithm> using names ...

  5. 牛客 NOIp模拟1 T1 中位数 解题报告

    中位数 题目描述 小\(N\)得到了一个非常神奇的序列\(A\).这个序列长度为\(N\),下标从\(1\)开始.\(A\)的一个子区间对应一个序列,可以由数对\([l,r]\)表示,代表\(A[l] ...

  6. 牛客 NOIp模拟1 T3 保护 解题报告

    保护 题目描述 \(C\)国有\(n\)个城市,城市间通过一个树形结构形成一个连通图.城市编号为\(1\)到\(n\),其中\(1\)号城市为首都.国家有\(m\)支军队,分别守卫一条路径的城市.具体 ...

  7. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

  8. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  9. NOIP模拟赛20161022

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

随机推荐

  1. 树莓派(Raspberry Pi)搭建简单的lamp服务

    树莓派(Raspberry Pi)搭建简单的lamp服务: 1. LAMP 的安装 sudo apt-get install apache2 mysql-server mysql-client php ...

  2. C#更改文件访问权限所有者(适用于各个Windows版本)

    前面也提到了,前段时间在做Online Judge系统,在正式上线前有几个比较老的版本,其中第一个版本使用ACL来控制权限以确保安全(但是这个版本完全建立在IIS上,所以这样做是没效果的),遇到了一些 ...

  3. 【转】一个lucene的官网例子

    创建索引: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import jav ...

  4. 自己写一个java.lang.reflect.Proxy代理的实现

    前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...

  5. 冲刺阶段 day12

    项目进展 周二我们将专业管理部分又继续做了完善,之前漏掉的几项功能也都在熟能生巧中编写的越来越顺畅,但还差最后一点数据库部分没能实现,我们会尽快完成. 存在问题 还是与数据库的连接上出现问题,部分不能 ...

  6. 记一次Url重写_发布之后iis 404

    把api封装完,客户要求app的url能不能不变(客户之前用的php的api开发app,已经开发了很多了,所以希望不改动url).但是这个规则要求是:xx/api.php?s=/{controller ...

  7. 论checkbox和radio的样式美化问题

    如果你下定决心要改变现有的默认的checkbox和radio的样式,那么我目前有两种办法: 1.自己动手写一个,也就是自己写代码实现将input的checkbox和radio默认的样式隐藏掉,使用绝对 ...

  8. [算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本

    一.有啥用 这里用的是LIS3DH三轴加速计,输出为X.Y.Z轴的加速度,通过串口连接电脑,电脑里运行matlab脚本通过串口实时获取数据并做可视化显示. 这里虽然是针对LIS3DH的,其实稍作修改即 ...

  9. undefined function openssl_x509_read

    打开php.ini,找到这一行 ;extension=php_openssl.dll,将前面的";"去掉 再重启apache或者iis即可

  10. Linux网络编程系列-套接口选项控制

    获取和设置套接口选项的方法有: getsockopt/setsockopt fcntl ioctl getsockopt/setsockopt 这两个函数仅用于套接口(socket)的设置,另外两个函 ...