灯塔问题

 
  

描述

 
  

海上有许多灯塔,为过路船只照明。从平面上看,海域范围是[1, 10^8] × [1, 10^8] 。

 
  

图一

 
  

(图一)

 
  

如图一所示,每个灯塔都配有一盏探照灯,照亮其东北、西南两个对顶的直角区域。探照灯的功率之大,足以覆盖任何距离。灯塔本身是如此之小,可以假定它们不会彼此遮挡。

 
  

 
  

(图二)

 
  

若灯塔A、B均在对方的照亮范围内,则称它们能够照亮彼此。比如在图二的实例中,蓝、红灯塔可照亮彼此,蓝、绿灯塔则不是,红、绿灯塔也不是。

 
  

现在,对于任何一组给定的灯塔,请计算出其中有多少对灯塔能够照亮彼此。

 
  

输入

共n+1行。

第1行为1个整数n,表示灯塔的总数。

第2到n+1行每行包含2个整数x, y,分别表示各灯塔的横、纵坐标。

 
  

输出

1个整数,表示可照亮彼此的灯塔对的数量。

 
  

输入样例

3
2 2
4 3
5 1
 
  

输出样例

1



1
# include<stdio.h> 2 3 int quick(int a[],int A[],int b, int c){ 4 int inversion = 0; 5 if (c > b){ 6 int middle = (int)((b + c) / 2); 7 int u = b; int v = c; 8 inversion+=quick(a,A,b,middle); 9 inversion+= quick(a, A, middle + 1, c); 10 inversion+= merge(a, A, u, middle, v); 11 } 12 return inversion; 13 } 14 15 16 int merge(int a[],int B[], int b, int m, int c){ 17 int i = b; int j = m + 1; int k = 0; int inversion = 0; 18 while (i <= m && j <= c) 19 { 20 if (a[i] <= a[j]) 21 { 22 B[k++] = a[i++]; 23 inversion= inversion +c-j+1; 24 } 25 else{ 26 B[k++] = a[j++]; 27 } 28 } 29 while (i <= m) 30 B[k++] = a[i++]; 31 while (j <= c) 32 B[k++] = a[j++]; 33 34 for (i = 0; i < k; i++) 35 a[b + i] = B[i]; 36 return inversion; 37 } 38 39 void main(){ 40 int A[18] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int a[18]; 41 int Source_inversion = 0; int inversion = 0; 42 for (int i = 0; i < 18; i++){ 43 a[i] = rand() % 20; 44 } 45 for (int i = 0; i < 18; i++){ 46 printf("%d ", a[i]); 47 } 48 49 for (int t = 0; t < 17; t++){ 50 for (int m = t + 1; m < 18;m++ ) 51 { 52 if (a[m] >= a[t]) 53 Source_inversion++; 54 } 55 } 56 57 printf("\nSource method: %d\n", Source_inversion); 58 59 60 inversion=quick(a,A,0,17); 61 printf("\n\n"); 62 for (int i = 0; i < 18; i++){ 63 printf("%d ", a[i]); 64 } 65 printf("\nMerge sort count:%d",inversion); 66 system("pause"); 67 }

 

转载于:https://www.cnblogs.com/udld/p/4062162.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值