1. 程式人生 > >HDU5784(n個點組成多少鈍角三角形,然而無論什麼三角形都是同理的)

HDU5784(n個點組成多少鈍角三角形,然而無論什麼三角形都是同理的)

題意:給你n個點,可以組成多少鈍角三角形。

分析:答案毋庸置疑,(銳角個數-(鈍角個數+直角)*2)、3;

暴力的方法,枚舉出所有的邊,然後在列舉角度,但是這樣是n^4的。太暴力

但是如果對斜率拍個序,這樣就能把兩兩角在銳角和鈍角的區間劃出來。再用雙指標列舉。複雜度就只有n^2*log(n)了。具體看程式碼。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
const double eps=1e-9;
int n;
struct node1
{
    double x,y;
}a[2010];
double node[4010];
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);
        ll ans1=0,ans2=0;
        for(int i=1;i<=n;i++)
        {
            int cnt=0;
            for(int j=1;j<=n;j++)
            {
                if(i==j)continue;
                node[++cnt]=atan2(a[i].y-a[j].y,a[i].x-a[j].x);
                if(node[cnt]<0)node[cnt]+=2*pi;
            }
            sort(node+1,node+1+cnt);
            for(int j=1;j<=cnt;j++)node[j+cnt]=node[j]+2*pi;
            int l=1,r=1,len=1;
            for(int j=1;j<=cnt;j++)
            {
                while(r<=2*cnt&&node[r]-node[j]<pi)r++;
                while(l<=2*cnt&&node[l]-node[j]<0.5*pi)l++;
                while(len<=2*cnt&&node[len]==node[j])len++;
                ans1+=r-l;
                ans2+=l-len;
            }
        }
        //printf("%lld %lld\n",ans2,ans2);
        printf("%lld\n",(ans2-2*ans1)/3);
    }
    return 0;
}


相關推薦

HDU5784n組成多少鈍角三角形然而無論什麼三角形同理

題意:給你n個點,可以組成多少鈍角三角形。 分析:答案毋庸置疑,(銳角個數-(鈍角個數+直角)*2)、3; 暴力的方法,枚舉出所有的邊,然後在列舉角度,但是這樣是n^4的。太暴力 但是如果對斜率拍個序,這樣就能把兩兩角在銳角和鈍角的區間劃出來。再用雙指標列舉。複雜度就只有n

hdu5424 Rikka with Graph IInn條邊的圖判哈密頓通路

Rikka with Graph II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 547    

n帶編號的人和n帶編號的座位求每個人不坐在相同號碼座位的方案數目

題目描述:     有 n 位同學編號分別為1, 2, ..., n; 有 n 個座位編號分別為1, 2, ..., n。     現在為每一位同學安排一個座位,求每個同學都坐在與自己編號不同的座位的方案數目。 分析:動態規劃思想:     假設 i 位同學,i 個座

農田開發 NOJ 已知N選取3求最大三角形面積問題

E - 農田開發時間限制(普通/Java) : 1000 MS/ 3000 MS 執行記憶體限制 : 65536 KByte總提交 : 83 測試通過 : 43 比賽描述有一塊農田,田地裡安放上N個小

(hdu step 7.1.6)最大三角形(凸包的應用——在n中找到3,它們所形成的三角形面積最大)

三角形 struct names com 都在 acm sni 都是 tran 題目:最大三角形Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S

階乘與排列的例子n元素中取m元素組成互不相同並且不重複的三位數

public static void main(String[] args) { //1.編寫一個程式,輸入n,求n!(用遞迴的方式實現)。4*3*2*1=4! 注:0!=1 System.out.println("4的階乘為:" + getFactoria

hdu step 7 1 6 最大三角形 凸包的應用——在n中找到3 它們所形成的三角形面積最大

                題目:最大三角形Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 121 Accepted Submission(s): 61

C++求解:平面上有n問總共可以組成多少條直線

思路 對輸入的點,兩兩組合求取斜率,這樣可能會出現某一斜率對應多對點。然後對屬於同一斜率的多對點,當成一幅圖,求取連通分支個數。 這裡對對屬於同一斜率的多對點,當成一幅圖,求取連通分支個數解釋一下: 假設對於斜率k=1.0,有點對 (1,1) ,(2,2

n求 能構成多少三角形

思路:1、先求出n個結點中取出三個結點 有多少種方法 C(n,3)的組合; 2、在找出三個點不能組成三角形的情況;有斜率相等和不存在斜率兩種情況; 完整程式碼如下: #include<ios

HDU6055空間內n組成多少正方形

#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #

SPOJ3931(N形成三角形的最大面積)

題意:就是給定一些點,點的個數最多為50000,從這n個點中選3個點形成的三角形面積最大是多少? 分析:對於這個問題,在網上題解中各種方法都有,但是大部分都是不可靠的,現在我知道的最快的正確方法是      O(n^2)的。貌似還有O(nlog(n))的演算法。我們可

空間中任意三組成三角形面積

問題1:遍歷所有可能的3個點 1 2 3 for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) for(int k = j + 1; k

數理統計 - 圓環上隨機取3組成一個銳角三角形的概率

dot and spl author span ted 密度 splay lag 問題 在一個圓環上隨機取3點,求這3個點組成一個銳角三角形的概率 題解 如下圖所示: 取單位圓上任意兩點點A和B,A、B兩點確定以後,點A、B、C三點要夠成銳角三角形,點C必須在DE之

C語言中可變參數的函數“...”

stdarg url title amp 至少 關閉 .com temp () C語言中可變參數的函數(三個點,“...”)   本文主要介紹va_start和va_end的使用及原理。   在以前的一篇帖子Format MessageBox 詳解中曾使用到va_st

最小割經典題依附在一起的情況poj3469

minimum 兩個 color computer upd 情況 nim %d struct Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 25099

【XSY1295】calc nn條邊無向連通圖計數 prufer序列

ring pre end ctime 節點 splay 按順序 sin algorithm 題目大意   求\(n\)個點\(n\)條邊的無向連通圖的個數   \(n\leq 5000\) 題解   顯然是一個環上有很多外向樹。   首先有一個東西:\(n\)個點選\(k\

numpy_數組無冒號單冒號雙冒號

num span ... pre style IV AR color col import numpy >>> a = numpy.array([[1,2,3,4,5],[6,7,8,9,10],[1,2,3,4,5],[6,7,8,9,10]]) &g

E - Magic Points (0到4*n-5圍成正方形最多交點)

滴答滴答---題目連結  Given an integer , we say a point  on a 2D plane is a magic point, if and only if both  and  ar

a+aa+aaa+aaaa+aaaaa+......+aaaaanajava大數比c更簡單

開胃話:每次遇到大數的計算都沒來得及整理,今天覺得有必要以一道例題來總結一下了,c中一般都是用字串來解決的,而java中就可以用BigInteger來解決了,大家可以看看下面連結的這篇部落格,寫的比較完善的: https://blog.csdn.net/dongchengrong/art

並查集:按秩合併 $n$ 所得樹高不超過 $\lfloor\log n \rfloor$

用 $h_n$ 表示按秩合併 $n$ 個點所得樹的最大高度。 有 $h_1 = 0, h_2 = 1, h_3 = 1, h_4 = 2, h_5 = 2, \dots$ 有如下地推: \[ h_n = \max_{1\le i\le n-1} \max(h_i, h_{n-i}) + [h_i = h_{n