2022-03-28:有一个以原点为圆心,半径为1的圆。 在这个圆的圆周上,有一些点, 因为所有的点都在圆周上,所以每个点可以有很简练的表达。 比如:用0来表示一个圆周上的点,这个点就在(1,0)位置

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-03-28:有一个以原点为圆心,半径为1的圆。 在这个圆的圆周上,有一些点, 因为所有的点都在圆周上,所以每个点可以有很简练的表达。 比如:用0来表示一个圆周上的点,这个点就在(1,0)位置相关的知识,希望对你有一定的参考价值。

2022-03-28:有一个以原点为圆心,半径为1的圆。
在这个圆的圆周上,有一些点,
因为所有的点都在圆周上,所以每个点可以有很简练的表达。
比如:用0来表示一个圆周上的点,这个点就在(1,0)位置,
比如:用6000来表示一个点,这个点是(1,0)点沿着圆周逆时针转60.00度之后所在的位置,
比如:用18034来表示一个点,这个点是(1,0)点沿着圆周逆时针转180.34度之后所在的位置,
这样一来,所有的点都可以用[0, 36000)范围上的数字来表示。
那么任意三个点都可以组成一个三角形,返回能组成钝角三角形的数量。
来自hulu。

答案2022-03-28:

半圆同侧两点必然是钝角三角形。
时间复杂度:排序的。

代码用golang编写。代码如下:

package main

import (
	"fmt"
	"sort"
)

func main() 
	arr := []int10000, 20000, 30000, 10100, 10200
	ret := obtuseAngles(arr)
	fmt.Println(ret)


func obtuseAngles(arr []int) int 
	// n长度的排序,O(N * logN)
	// O(N)
	n := len(arr)
	m := n << 1
	enlarge := make([]int, m)
	sort.Ints(arr)
	for i := 0; i < n; i++ 
		enlarge[i] = arr[i]
		enlarge[i+n] = arr[i] + 36000
	
	ans := 0
	// 这里不用二分查找(太慢),能做一个不回退的优化
	for L, R := 0, 0; L < n; L++ 
		for R < m && enlarge[R]-enlarge[L] < 18000 
			R++
		
		ans += num(R - L - 1)
	
	return ans


func num(nodes int) int 
	if nodes < 2 
		return 0
	 else 
		return ((nodes - 1) * nodes) >> 1
	


执行结果如下:


左神java代码

以上是关于2022-03-28:有一个以原点为圆心,半径为1的圆。 在这个圆的圆周上,有一些点, 因为所有的点都在圆周上,所以每个点可以有很简练的表达。 比如:用0来表示一个圆周上的点,这个点就在(1,0)位置的主要内容,如果未能解决你的问题,请参考以下文章

Wannafly挑战赛25 B 面积并 数学

在坐标轴中的多边形,以原点为圆心旋转一定角度,旋转公式是啥

以原点为中心,半径为 r 的圆内/沿快速整数坐标

python语言编程

一起复习几何

ZOJ 3993 - Safest Buildings - [数学题]