1. 程式人生 > >HDU6055空間內n個點能組成多少個正方形

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

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std ;
#define eqs 1e-9
struct node{
    double x , y ;
}p[1100] ;
bool cmp(node a,node b)
{
    return ( a.x < b.x || ( a.x == b.x && a.y < b.y ) ) ;
}
bool judge(double x,double y,int n)
{
    int low = 0 , mid , high = n-1 ;
    while( low <= high )
    {
        mid = (low + high) / 2 ;
        if( fabs(p[mid].x-x) < eqs && fabs(p[mid].y-y) < eqs )
            return true ;
        else if( p[mid].x-x > eqs || ( fabs(p[mid].x-x) < eqs && p[mid].y-y > eqs ) )
            high = mid - 1 ;
        else
            low = mid + 1 ;
    }
    return false ;
}
int main()
{
    int n , i , j , num ;
    double x , y , xx , yy ;
    while( scanf("%d", &n) !=EOF)
    {
        num = 0 ;
        for(i = 0 ; i < n ; i++)
        {
            scanf("%lf %lf", &p[i].x, &p[i].y) ;
        }
        sort(p,p+n,cmp) ;
        for(i = 0 ; i < n ; i++)
        {
            for(j = i+1 ; j < n ; j++)
            {
                if( i == j ) continue ;
                x = (p[i].x+p[j].x)/2 ;
                y = (p[i].y+p[j].y)/2 ;
                xx = p[i].x - x ;
                yy = p[i].y - y ;
                if( judge(x+yy,y-xx,n) && judge(x-yy,y+xx,n) )
                {
                    num++ ;
                }
            }
        }
        printf("%d\n", num/2) ;
    }
    return 0;
}
#include <bits/stdc++.h>  
#define ll long long
#define mk make_pair
#define y1 yyy
using namespace std;
const int N = 1e3 + 5;
map< pair<int, int>, bool> M;  
int x[N], y[N], n, ans;
int main() {
	int T;
	while (scanf("%d", &n) != EOF) {
		ans = 0;
		M.clear();
		for (int i = 1; i <= n; i++) {
			scanf("%d %d", x + i, y + i);
			M[mk(x[i], y[i])] = 1;
			
		}
		for (int i = 1; i <= n; i++) {
			for (int j = i + 1; j <= n; j++) {
				int dx = y[j] - y[i];
				int dy = x[i] - x[j];
				int ok = 0; 
				if (M.count(mk(x[i] + dx, y[i] + dy))) ok++;
				if (M.count(mk(x[j] + dx, y[j] + dy))) ok++;
				if (ok == 2) ans++;
				ok = 0;
				if (M.count(mk(x[i] - dx, y[i] - dy))) ok++;
				if (M.count(mk(x[j] - dx, y[j] - dy))) ok++;
				if (ok == 2) ans++;
			}
		}
		printf("%d\n", ans / 4);
	}
} 


相關推薦

HDU6055空間n組成多少正方形

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

有 1、2、3、4 數字,組成多少互不相同且無重復數字的三位數?都是多 少?

set 復數 集合 form for 依次 sam code 合成 """ 題目:有 1、2、3、4 個數字,能組成多少個互不相同且無重復數字的三位數?都是多 少? """ # 解決思路:三個for循環依次從4個數中取1個 把所有情況都包括 利用集合來去重 samp

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

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

有1,2,3,4四數字,組成多少互不相同且無重複數字的三位數?都是多少?

public class MainActivity extends AppCompatActivity { int i=0; //儲存百位上的數 int j=0; //儲存十位上的數 in

Bellman-Ford算法——為什麽要循環V-1次?圖有n,又不有回路,所以最短路徑最多n-1邊。又因為每次循環,至少relax一邊所以最多n-1次就行了!

bold source 頂點 路由 偽代碼 font 端點 -a 自底向上 單源最短路徑 給定一個圖,和一個源頂點src,找到從src到其它所有所有頂點的最短路徑,圖中可能含有負權值的邊。 Dijksra的算法是一個貪婪算法,時間復雜度是O(VLogV)(使用最小堆)。但是

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

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

n構成多少三角形

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

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

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

(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

存條不啟動

無法啟動 時間 img 再次 image justify 1-1 p s logs 新買了一個金士頓DDR2 2G的內存,原來那個也是一樣的,兩條插上後電腦無法啟動,拔下任意一條都能啟動, 怎麽回事那? 【解決方法】 設置BIOS的延遲時間。我分析可能是兩個內存條需要更

計算任意兩個位整數之間所組成的奇數個數

lac .com logs onclick 判斷 document com 編寫 htm <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>&

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

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

有1、2、3、4數字,組成多少互不相同且無重復數字的三位數?都是多少?

無重復 個數 nbsp 宋體 spa 個數字 bsp != 重復數 .程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去掉不滿足條件的排列。 2.程序源代碼: ‘‘‘ for i in range(1,5): for j in range

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

判斷經緯度座標是否在經緯度組成的面

maven的pom配置 <dependency> <groupId>com.vividsolutions</groupId> <artifactId>jts</artifactId> <version>

java經典題丨有1、2、3、4四數字,組成多少互不相同且無重複數字的三位數?都是多少?

組合成三個互不重複的數字,不難理解,其他的好辦,但是互不重複,就有點難度了,這個是解決本題思路的重點,程式碼如下: public static void main(String[] args) { int x=0,y=0,z=0,count=0; for(x=1;x<=4;

[素數篩] 求n的不同因數之和組成的連續1~x的x ZOJ4040

Number Theory Time Limit: 1 Second      Memory Limit: 65536 KB Given an integer , calculate the smalle

並查集:按秩合併 $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

題目:有1、2、3、4數字,組成多少互不相同且無重複數字的四位數?都是多少?

#include<stdio.h> int main() { int i,j,k,t=0,l; for(i=1;i<5;i++) for(j=1;j<5;j++) for(k=1;k<5;k++) for(l=1;l<5;l+