Codeforces Round #198 (Div. 2) C. Tourist Problem (数学+dp)
1 second
256 megabytes
standard input
standard output
Iahub is a big fan of tourists. He wants to become a tourist himself, so he planned a trip. There are n destinations on a straight road that Iahub wants to visit. Iahub starts the excursion from kilometer 0. The n destinations are described by a non-negative integers sequencea1, a2, ..., an. The number ak represents that the kth destination is at distance ak kilometers from the starting point. No two destinations are located in the same place.
Iahub wants to visit each destination only once. Note that, crossing through a destination is not considered visiting, unless Iahub explicitly wants to visit it at that point. Also, after Iahub visits his last destination, he doesn't come back to kilometer 0, as he stops his trip at the last destination.
The distance between destination located at kilometer x and next destination, located at kilometer y, is |x - y| kilometers. We call a "route" an order of visiting the destinations. Iahub can visit destinations in any order he wants, as long as he visits all n destinations and he doesn't visit a destination more than once.
Iahub starts writing out on a paper all possible routes and for each of them, he notes the total distance he would walk. He's interested in the average number of kilometers he would walk by choosing a route. As he got bored of writing out all the routes, he asks you to help him.
The first line contains integer n (2 ≤ n ≤ 105). Next line contains n distinct integers a1, a2, ..., an (1 ≤ ai ≤ 107).
Output two integers — the numerator and denominator of a fraction which is equal to the wanted average number. The fraction must be irreducible.
3
2 3 5
22 3
Consider 6 possible routes:
- [2, 3, 5]: total distance traveled: |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.
The average travel distance is
=
=
.
思路:
1.分析第一步,有(0->(a1~an))共n中走法,每种走法会出现(n-1)!次。
2.分析其他步,ai->aj,先不考虑i、j两点,还有n-2各点,排列方式为(n-2)!种,n-2各点排列好后,就可以将i、j两点
看做一个整体插入到这个序列的中间(有n-1个位置可以插入),于是ai->aj的走法也会出现(n-1)!次。
所以推得公式为:[(a1+...+an)+∑|ai-aj|]/n,(i!=j) 。
ps:公式推出来只完成了一步,因为数据范围到了10^5。
3.以{a1,a2,a3,a4}为例,计算|ai-aj|实际上就是计算序列{a1,a2,a3,a4}任意两条线段的长度之和。
利用ai->aj覆盖了ai->a(j-1),从左向右观察,则以a2结束的线段只有S2=a1->a2,以a3结束的线段有a1->a3,a2->a3,
其中a1->a3可以看做a1->a2+a2->a3,这里a1->a2已经计算好了,所以S3=S2+2*(a2->a3)。S4同理。
4.若将数组a排好序,先只考虑i<j的情况(i>j的情况的值和i<j的情况值是一样的),就好处理了,就可以得到转移方
程s[i]=s[i-1]+(i-1)*|a[i]-a[i-1]|;s[i]为以i点为结束点的路径总和。
代码:
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <vector>
#include <cmath>
#define maxn 100005
using namespace std; typedef long long ll;
ll n,m,ans,u,v,sum;
ll a[maxn],s[maxn]; ll gcd(ll xx,ll yy)
{
ll r=xx%yy;
if(r==0) return yy;
else return gcd(yy,r);
}
void solve()
{
ll i,j,g;
u=0;
s[1]=0;
for(i=2;i<=n;i++)
{
s[i]=s[i-1]+(i-1)*fabs(a[i]*1.0-a[i-1]);
u+=s[i];
}
u=2*u+sum;
v=n;
g=gcd(u,v);
u/=g;
v/=g;
}
int main()
{
ll i,j;
while(~scanf("%I64d",&n))
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
sum+=a[i];
}
sort(a+1,a+n+1);
solve();
printf("%I64d %I64d\n",u,v);
}
return 0;
}
Codeforces Round #198 (Div. 2) C. Tourist Problem (数学+dp)的更多相关文章
- Codeforces Round #198 (Div. 2) C. Tourist Problem
C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #367 (Div. 2) C. Hard problem(DP)
Hard problem 题目链接: http://codeforces.com/contest/706/problem/C Description Vasiliy is fond of solvin ...
- Codeforces Round #603 (Div. 2) A. Sweet Problem(数学)
链接: https://codeforces.com/contest/1263/problem/A 题意: You have three piles of candies: red, green an ...
- Codeforces Round #367 (Div. 2) C. Hard problem
题目链接:Codeforces Round #367 (Div. 2) C. Hard problem 题意: 给你一些字符串,字符串可以倒置,如果要倒置,就会消耗vi的能量,问你花最少的能量将这些字 ...
- Codeforces Round #198 (Div. 2)A,B题解
Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...
- Codeforces Round #603 (Div. 2) A. Sweet Problem(水.......没做出来)+C题
Codeforces Round #603 (Div. 2) A. Sweet Problem A. Sweet Problem time limit per test 1 second memory ...
- Codeforces Round #198 (Div. 2)
A.The Wall 题意:两个人粉刷墙壁,甲从粉刷标号为x,2x,3x...的小块乙粉刷标号为y,2y,3y...的小块问在某个区间内被重复粉刷的小块的个数. 分析:求出x和y的最小公倍数,然后做一 ...
- Codeforces Round #198 (Div. 2) 340C
C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #198 (Div. 2)C,D题解
接着是C,D的题解 C. Tourist Problem Iahub is a big fan of tourists. He wants to become a tourist himself, s ...
随机推荐
- C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)
先说实在的:最终解决办法是实现IDocHostUIHandler接口,在GetHostInfo方法里解决,但“实现接口”意味着QueryInterface.AddRef.Release三个方法必须实现 ...
- "Invalid username/password or database/scan listener not up"
文档 ID … 11.2 RAC DBconsole Creation Fails With Error: "Invalid username/password or ...
- [Java][Android][Process] ProcessBuilder与Runtime差别
在Android中想要进行Ping,在不Root机器的情况下似乎还仅仅能进行底层命调用才干实现. 由于在Java中要进行ICMP包发送须要Root权限. 于是仅仅能通过创建进程来攻克了.创建进程在Ja ...
- Spring核心技术
这是第二次看关于Spring的资料,由于刚開始学习Spring的时候是边看视频边学习的,所以更注重的是实现代码,可是对宏观的掌握还是不够,这次主要从宏观的角度来分析一下Spring. 什么是Sprin ...
- JDK动态代理简单小程序
Jdk动态代理 1.动态代理使用的情况:需要在多个方法上加上相同的逻辑的时候,需要用到动态代理. 原因:在多个方法上写相同的逻辑,第一费事,第二在不用的时候维护麻烦 使用动态代理需要用到两个类:分别为 ...
- UVa 10286 - Trouble with a Pentagon
题目:如图在正五边形中画一个正方形,一直正五边形边长,求正方形边长. 分析:计算几何,解析几何.求出边长的比例关系带入求解就可以. 设正五边形边长为1,在顶点建立直角坐标系,则左上角坐标为:B(-co ...
- copy算法
copy------强化效率无所不用其极 copy(first,last,result)算法可将输入区间[first,last)内的元素拷贝到输出区间[result,result+(last-f ...
- VLC笔记 它 立志
不过,别忘了找工作的时候毕业,我说:"至少不会操心你会饿死了". 直到刚刚我才认为我妈有点过于乐观了. 今天下午,在做vlc如今播放器部分,一堆代码看的我头大. 正在此时,boss ...
- JavaScript2谁刚开始学习应该知道4最佳实践文章(翻译)
原版的:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意公布日期,觉得不错就翻译了,翻译到JSON.parse那一节觉得有点不正确路才 ...
- 从零开始学C++之动态创建对象
回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Circle"之类的语法,导致CreateShape 函 数中需要不断地ifelse地去判断, ...