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++知识库 -> 洛谷 P2181 对角线(C语言) -> 正文阅读

[C++知识库]洛谷 P2181 对角线(C语言)

题目描述

对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。

例如,6 边形:

输入格式

输入只有一行一个整数 n,代表边数。

输出格式

输出一行一个整数代表答案。

输入样例 1

3

输出样例 1

0

输入样例 2

6

输出样例 2

15

说明/提示

数据规模与约定
对于 50% 的数据,保证 3 ≤ \leq n ≤ \leq 100。 对于100%的数据,保证 3 ≤ \leq n ≤ \leq 105

题目分析

QAQ,因为之前并没有接触过对角线的相关问题,然后我也没想到能推公式。所以这个题目我是自己画图推的。

我的想法是:
因为题目说“它的任何三条对角线都不会交于一点”,所以我们只需要考虑有多少个两两之间的对角线会相交就可以了。

然后如何计算一个对角线会和几个对角线相交呢,我想到的是如果先定下两个顶点之间的对角线A,另一条对角线B要和它相交,那么另一条对角线B的两个顶点一定是分别在这个定下的对角线A的两侧。

所以这个对角线上有几个交点就等于,这个对角线的右边顶点数 * 左边顶点数。
假设为 8 边形,因为该对角线自己要占用两个顶点,所以其左右顶点之和为8 - 2 = 6。
那么该对角线上的交点就一共有以下几种情况:
请添加图片描述
而多边形的每一个顶点上,刚好可以取得和上述五种情况对应的对角线。
所以可得每个顶点的所有对角线上的交点为
在这里插入图片描述
如果将一个顶点的总交点数乘以顶点数,得到的值是将每个顶点都算了四次的值,所以再除以4就可以得到总的交点数。

算了四次的原因是,一个交点是由两个对角线参与的,然后我们算了每个顶点的每个对角线,所以每个对角线我们都算了两次,而又将两个对角线的先后顺序交换算了一次交点,所以一共计算了2*2次

参考代码

因为3 ≤ \leq n ≤ \leq 105,所以计算结果比较大,我最开始只是用long long,但是结果还是会有两个WA,后来我发现了高精———unsigned long long,就可以AC啦。

#include "stdio.h"

//交点数等于每个顶点出发的对角线的交点数相加 / 4
//每个对角线上的交点数等于 该对角线左边的顶点乘以右边的顶点
//所以每个顶点的交点数为 (n-2-1)*1 + (n-2-2)*2 + (n-2-3)*3 ... +1*(n-2-1)

/*
*计算每个顶点出发的对角线的交点
*@Param sideCount:int  多边形的边数量 
*/
unsigned long long intersectionEachVertex(unsigned long long sideCount){
	//交点数量 
	unsigned long long intersection = 0;
	for(int i = 1;i <= sideCount - 2 - 1; i++){
		intersection += (sideCount - 2 - i) * i;
	}
	return intersection;
}

int main(){
	
	//多边形的边数 
	unsigned long long sideCount;
	
	//输入多边形的边数
	scanf("%lld",&sideCount);
	
	//计算每个顶点出发的对角线的交点 
	unsigned long long intersection = intersectionEachVertex(sideCount);
	
	printf("%lld",intersection * (unsigned long long)sideCount / 4);
		
	return 0;
} 

如果有帮助到您,请帮我点个赞哦。
如果对本文章有疑问,欢迎在评论区留言。

😁

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 00:10:58  更:2021-07-28 00:11:38 
 
开发: 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年4日历 -2024/4/29 3:17:06-

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