51Nod_1278 相离的圆

http://www.51nod.com/Challenge/Problem.html#!#problemId=1278

题目

平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} {2, 3} {2, 4} {3, 4}这5对都有交点,只有{1, 4}是相离的。

输入

第1行:一个数N,表示圆的数量(1 <= N <= 50000);第2 - N + 1行:每行2个数P, R中间用空格分隔,P表示圆心的位置,R表示圆的半径(1 <= P, R <= 10^9)

输出

输出共有多少对相离的圆。

样例输入

4
1 1
2 1
3 2
4 1

样例输出

1

分析

将圆看作一条在X轴上的线段,左右端点的坐标为圆心坐标减、加半径。然后将线段进行排序,左端点小的排在前面,左端点相同时右端点小的排在前面 ,然后遍历n个圆,统计与此时遍历的圆相离的圆的个数,找到第一个与圆i相离的圆的编号,由排序原则可知,此圆之后的圆都与圆i相离,使用二分法查找与圆i相离的第一个圆的编号,具体看程序。

C++程序

#include<iostream>
#include<algorithm>using namespace std;const int N=50100;typedef long long ll;struct Line{int l,r;//左右端点的一维坐标 bool operator <(const Line &p)const{//左端点小的排在前面,左端点相同时右端点小的排在前面 return l==p.l?(r<p.r):(l<p.l);}
}a[N];int main()
{int n,x,r;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d",&x,&r);a[i].l=x-r;a[i].r=x+r;}sort(a,a+n);ll ans=0;for(int i=0;i<n;i++)//统计与圆i相离的圆的个数{//找到第一个与圆i相离(a[id].l>a[i].r)的圆的编号,由排序原则可知,此圆之后的圆都与圆i相离//使用二分查找 int l=i+1,r=n-1,mid=n;while(l<=r){mid=(l+r)/2;if(a[mid].l<a[i].r)l=mid+1;else if(a[mid].l>a[i].r)r=mid-1;else break;}while(mid<n&&a[mid].l<=a[i].r) mid++; //记录第一个与圆i相离的圆的编号 if(mid!=n)ans+=n-mid; } printf("%lld\n",ans);return 0;
}

51Nod_1278 相离的圆【贪心+二分】相关推荐

  1. 【51nod】---1278 相离的圆(二分排序)

    题目链接:题目 1278 相离的圆 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多 ...

  2. [51Nod](1278)相离的圆 ---- 二分查找

    平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} ...

  3. 1278 相离的圆(任务调度,贪心)

    平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} ...

  4. 51NOD 1278 相离的圆(二分 + 排序 好题)

    平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} ...

  5. 51nod 1278 相离的圆 二分+排序

    1278 相离的圆 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个 ...

  6. 51nod 1278 相离的圆

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, ...

  7. 相离的圆(51Nod-1278)

    题目 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, ...

  8. 51Nod 1278 相离的圆 c/c++题解

    题目描述 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1 ...

  9. 51nod-1278 相离的圆

    1278 相离的圆 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离 ...

最新文章

  1. mysql和Oracle数据库的一些异同。
  2. 小胖机器人能刷碗吗_小胖机器人好不好?透过真相看本质
  3. C\C++ 交换两个变量的方法
  4. matlab取角马为什么减一,动物世界角马为什么不敢攻击狮子?
  5. Linux 环境变量设置及查看
  6. 1.极限——ε-δ例子_7
  7. 华为ensp(telnet)实验
  8. 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
  9. android表格布局占满整行,Android布局之表格布局TableLayout详解
  10. 电脑蓝牙连接android程序,win7系统下电脑与Android手机蓝牙连接方法
  11. Hibernate的一对一,一对多/多对一关联保存
  12. 探花交友_第2章-完善个人信息与MongoDB入门
  13. antd a-input-number 的基本使用
  14. 中国版的Google被阉割掉多少?
  15. MYSQL数据库误删除恢复笔记收藏
  16. 数据重塑_Google是否会重塑电话
  17. C语言【程序21】 题目:打印出如下图案(菱形)
  18. wavplay控件应用之SigmaStudio
  19. 从数据仓库到数据集市
  20. P2P游戏更新解决方案,P2P游戏更新引擎,P2P大文件分发。

热门文章

  1. 两种构造最小生成树的算法(普里姆算法,克鲁斯卡尔算法)
  2. 为什么发动机需要吸入大量的空气?
  3. groupByKey与reduceByKey区别
  4. 数据分析师8大实用能力实战培养课程
  5. RTP/RTCP工程实践与问题解决方案(合集)
  6. Win11远程协助灰色无法勾选?Win11远程协助不能选择的解决方法
  7. 使用django框架完成详情页和列表页
  8. abd连接手机的三种方法
  9. 开放式式商业模式_开放式和封闭式耳机之间有什么区别,我应该得到什么?
  10. 如何区分2G/3G/4G基站