IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【蓝桥杯 算法提高】游览计划 -> 正文阅读

[C++知识库]【蓝桥杯 算法提高】游览计划

问题描述

在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千米处,所有景点都位于起点一侧。从起点出发,每次任选一个没有游览的景点,从当前位置出发到达那个景点游览这样进行n次,直到停在最后游览的那个景点。(最后不会回到起点。)在x千米处的点与在y千米处的点的路程为|x-y|千米。
平均的总游览路程是多少?她选择所有游览路线的概率是相等的,你可以认为这个概率等于1/n!。

输入格式

第一行一个数n,第二行n个数A1, A2 … An,如题目所述。
  2<n<100000,1≤Ai<10^7,对于任意1≤i<n,都有Ai<A(i+1)

输出格式

输出一行,两个数,答案的分子和分母。要求分子分母不能再约分。

样例输入

3
2 3 5

样例输出

22 3

思路分析

设两个景点ai和aj,根据排列组合,它们两个相邻访问的可能情况有2*(n-1)!种。在这些情况中,它们俩对距离的贡献为|ai - aj|×2×(n-1)!

我们算出任意两个景点相邻的贡献和,即为总的游览路程:ΣΣ|ai-aj|2(n-1)!
而分母是总的情况n!,上下约分后得到2 × ΣΣ|ai-aj| / n
即分子为 2 * ΣΣ|ai-aj|,分母为n

根据题目要求,要求分子分母不能再约分,因此循环除以分子分母的最大公约数,直到最大公约数为1

代码实现

#include <bits/stdc++.h>
using namespace std;
/*
问题描述
  在一条笔直的公路上有n个景点,第i个景点在Ai千米处,起点在0千米处,所有景点都位于起点一侧。
	从起点出发,每次任选一个没有游览的景点,从当前位置出发到达那个景点游览
	这样进行n次,直到停在最后游览的那个景点。(最后不会回到起点。)
  在x千米处的点与在y千米处的点的路程为|x-y|千米。
	平均的总游览路程是多少?(她选择所有游览路线的概率是相等的,你可以认为这个概率等于1/n!。)
输入格式
  第一行一个数n,第二行n个数A1, A2 ... An,如题目所述。
  2<n<100000,1≤Ai<10^7,对于任意1≤i<n,都有Ai<A(i+1)。
输出格式
  输出一行,两个数,答案的分子和分母。要求分子分母不能再约分。
样例输入
3
2 3 5
样例输出
22 3
 */ 
int n, tmp;
typedef long long ll;
ll gcd(ll a, ll b)
{
	return b == 0 ? a : gcd(b, a % b);	
} 
int main()
{
	scanf("%d", &n);
	vector<int> a(n);
	for (int i = 0; i < n; ++i)
	{
		scanf("%d", &tmp);
		a[i] = tmp;
	}
	/* 思路:
	 * 2 * ΣΣ|ai-aj| / n 即为所求,证明如下: 
	 * 设两个景点ai和aj,根据排列组合,它们两个相邻访问的可能情况有2*(n-1)!种 
	 * 在这些情况中,它们俩对距离的贡献为|ai - aj|*2*(n-1)!
	 * 我们算出任意两个景点相邻的贡献和,即为总的游览路程,即 ΣΣ|ai-aj|*2*(n-1)!
	 * 而分母是总的情况n!,上下约分后得到2 * ΣΣ|ai-aj| / n
	 * 即分子为 2 * ΣΣ|ai-aj|,分母为n
	 * 上下进行约分后, 即可得到最终结果 
	 */
	long long x = 0; // 分子
	
	for (int i = 0; i < n; ++i)
	{
		x += a[i];
		for (int j = i + 1; j < n; ++j)
		{
			x += 2 * (a[j] - a[i]);
		}
	}
	int res;
	long long y = n; // 分母 
	while ((res = gcd(x, y)) != 1)
	{
		x /= res;
		y /= res;
	}
	cout << x << " " << y << endl;
	return 0;	
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 15:59:31  更:2022-04-06 16:02:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:54:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码