51Nod_1278 相离的圆【贪心+二分】
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 相离的圆【贪心+二分】相关推荐
- 【51nod】---1278 相离的圆(二分排序)
题目链接:题目 1278 相离的圆 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多 ...
- [51Nod](1278)相离的圆 ---- 二分查找
平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} ...
- 1278 相离的圆(任务调度,贪心)
平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} ...
- 51NOD 1278 相离的圆(二分 + 排序 好题)
平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} ...
- 51nod 1278 相离的圆 二分+排序
1278 相离的圆 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个 ...
- 51nod 1278 相离的圆
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, ...
- 相离的圆(51Nod-1278)
题目 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, ...
- 51Nod 1278 相离的圆 c/c++题解
题目描述 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的. 例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1 ...
- 51nod-1278 相离的圆
1278 相离的圆 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离 ...
最新文章
- mysql和Oracle数据库的一些异同。
- 小胖机器人能刷碗吗_小胖机器人好不好?透过真相看本质
- C\C++ 交换两个变量的方法
- matlab取角马为什么减一,动物世界角马为什么不敢攻击狮子?
- Linux 环境变量设置及查看
- 1.极限——ε-δ例子_7
- 华为ensp(telnet)实验
- 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
- android表格布局占满整行,Android布局之表格布局TableLayout详解
- 电脑蓝牙连接android程序,win7系统下电脑与Android手机蓝牙连接方法
- Hibernate的一对一,一对多/多对一关联保存
- 探花交友_第2章-完善个人信息与MongoDB入门
- antd a-input-number 的基本使用
- 中国版的Google被阉割掉多少?
- MYSQL数据库误删除恢复笔记收藏
- 数据重塑_Google是否会重塑电话
- C语言【程序21】 题目:打印出如下图案(菱形)
- wavplay控件应用之SigmaStudio
- 从数据仓库到数据集市
- P2P游戏更新解决方案,P2P游戏更新引擎,P2P大文件分发。