2016级算法第二次上机-A.画个圈圈诅咒你
890 画个圈圈诅咒你
思路
简单题。题目中的圆并没有什么实际作用,简化成线段重合问题会更好理解些。
暴力解法:使用双重for循环会T到想哭,记住最直接的方法一般是过不了题的。
解法一:二分查找。空间较小,时间更长。
把圆相离的问题转换为线段相交的问题,按先起点后终点的顺序升序排列这些圆(线段)。对于每条线段,向右找到第一条起点比这条线段终点大的线段,然后后面的线段都会满足要求,这里用二分去找。具体参考参考代码一。
解法二:线性查找。时间更短,空间更大。
同样是把圆相离的问题转换为线段的相交问题,把所有圆的左点和右点记录下来,并标记他们是左还是右,点的数量是圆的数量的两倍。排序:按所有点的位置排,如果点位置一样,则左边点优先(重要)。从头到尾遍历一次,用一变量(初始值为n)记录右边有多少个圆的左点,遇到左点时变量减1,遇到右点时用答案加上当前变量值,即是此圆右边与之相离的数量(左边的不须计算否则会产生重复)。具体参考参考代码二。
分析
两种方法都需要排序,排序时间 \(O(NlogN)\) 。
查找时间:解法一是 \(O(NlogN)\),解法二是 \(O(N)\) 。
参考代码一
//
// Created by AlvinZH on 2017/10/24.
// Copyright (c) AlvinZH. All rights reserved.
//
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n, x, r;
struct Circle {
int left, right;
bool operator < (const Circle a) const {
if(left == a.left) return right < a.right;//其次右端
return left < a.left;//左端优先
}
}C[50005];
//二分查找右边最近的圆
int find(int l, int r, int x)
{
int m;
while(l <= r)
{
m = (l + r) >> 1;
if(C[m].left < x) l = m + 1;
else if(C[m].left >= x) r = m - 1;
}
return l;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i = 0; i < n; ++i) {
scanf("%d %d", &x, &r);
C[i].left = x - r;
C[i].right = x + r;
}
sort(C, C+n);
int ans=0;
for(int i = 0; i < n-1; i++) {
ans += n - find(i+1, n-1, C[i].right+1);
}
printf("%d\n", ans);
}
}
参考代码二
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n, x, r;
struct Node {
int x;//位置
int isR;//标记左右
bool operator < (const Node n) const {
if(x < n.x) return true;
else if(x == n.x && isR == 0) return true;
return false;
}
}N[100010];
int main()
{
while(~scanf("%d", &n))
{
int num = 0;
for (int i = 0; i < n; ++i) {
scanf("%d %d", &x, &r);
N[num].x = x - r;
N[num].isR = 0;
num++;
N[num].x = x + r;
N[num].isR = 1;
num++;
}
sort(N, N+num);
int ans = 0;
int sum = n;
for (int i = 0; i < num; ++i) {
if(N[i].isR == 0) sum--;
else ans += sum;
}
printf("%d\n", ans);
}
}
2016级算法第二次上机-A.画个圈圈诅咒你的更多相关文章
- 2016级算法第二次上机-B.Bamboo的OS实验
Bamboo的OS实验 分析 首先理解题意,要完成不同数量的不同命令,但是完成相同的命令之间必须有n个间隔,为使得时间最短,自然优先用其他命令来填充这n分钟的时间,由于数量少的命令可以用来填充空隙,所 ...
- 2016级算法第二次上机-G.ModricWang's Real QuickSort
873 思路 这是一道非常基础的题,目的是帮助大家回顾快排相关的知识.大家完成此题之后应该就对快排有比较深刻的印象了. 对于整个快排的流程,题目描述中已经给了清晰完整的伪代码.需要自己加工的部分就是, ...
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- 2016级算法第二次上机-E.AlvinZH的儿时梦想——运动员篇
862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇 ...
- 2016级算法第二次上机-D.Bamboo的饼干
Bamboo的饼干 分析 从两个数组中各取一个数,使两者相加等于给定值.要注意去重和排序 难度不大,方法很多,基本只要不大于O(n^2 ) 的都可以过.本意想考察二分搜索 还可以借助stl中的map, ...
- 2016级算法第二次上机-C.AlvinZH的儿时梦想——坦克篇
872 AlvinZH的儿时梦想----坦克篇 思路 简单题.仔细看题,题目意在找到直线穿过的矩形数最小,不能从两边穿过.那么我们只要知道每一行矩形之间的空隙位置就可以了. 如果这里用二维数组记住每一 ...
- 题解:2018级算法第二次上机 Zexal的排座位
题目描述: 样例: 实现解释: 一道看似复杂但实际既是斐波那契变形的题目 知识点:递推,斐波那契 通过问题的描述,可以得到以下规律:(除了座位数为一时)男生坐最后时,倒数第二个一定是女生:女生坐最后, ...
- 题解:2018级算法第二次上机 Zexal的流水线问题
题目描述: 样例: 实现解释: 最基础的流水线调度问题,甚至没有开始和结束的值 实现方法即得出状态转移方程后完善即可,设a[][i]存储着第一二条线上各家的时间花费,t[][i]存储着i处进行线路切换 ...
- 题解:2018级算法第二次上机 Zexal的竞赛
题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1 ...
随机推荐
- 返回JSON到前台的对象属性设置
1.项目中使用JSON的第三方架包:jackson-annotations-2.8.0.jar 2.可以将对象的属性返回进行相应的处理 比如格式化时间.密码敏感等属性 如:User.java pack ...
- Cisco VPP启动流程
Cisco VPP启动流程,有需要的朋友可以参考一下. VPP初始化 VLIB_INIT_FUNCTION用来定义构造函数,注册函数到vlib_main_t->init_function_reg ...
- hadoop错误:Does not contain a valid host:port authority
hadoop环境部署完,执行hdfs zkfc -formatZK命令时,提示如上图所示错误 错误内容: [root@study_1_1 hadoop]# hdfs zkfc -formatZK Ex ...
- MemoryUsage:监测java虚拟机内存使用
通过MemoryUsage可以查看Java 虚拟机的内存池的内存使用情况.MemoryUsage类有四个值(均以字节为单位): ===Init=== java虚拟机在启动的时候向操作系统请求的初始内存 ...
- MySQL 存储过程 -流程控制的使用
#五.流程控制的使用 #1.IF 使用 create PROCEDURE iftest1() BEGIN DECLARE a int DEFAULT 10; -- IF (a>1 &&a ...
- windows 安装 mysql5.7.17
下载mysql 进入官网:https://www.mysql.com/ 单击[Downloads]选项卡 最下面有个[ MySQL Community Edition (GPL)],单击[Commu ...
- linux查看日志文件内容命令tail、cat、tac、head、echo详解
linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, ---------- ...
- 自定义spring valid方式实现验证
推荐:http://blog.csdn.net/xulianboblog/article/details/51694924
- Backup--压缩备份和TDE
1>对启用TDE的数据库,压缩备份的备份文件大小与未压缩备份的备份文件大小差不多(压缩比为 1 ) 2>对启用TDE的数据库,压缩备份的备份时间远高于未压缩备份 2>对启用TDE的数 ...
- AgentJob--修改操作系统时间对Job的影响
场景:有一个数据库作业每10分钟运行一次,在系统管理员修改操作系统时间后,作业长时间未运行. 分析:作业最后一次运行时间是 10:20,按照作业的计划,下一次的运行时间为 10:30,而系统管理员修改 ...