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 ...
随机推荐
- 85. Maximal Rectangle 由1拼出的最大矩形
[抄题]: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...
- C# 实现脚本辅助功能
http://blog.csdn.net/w86440044/article/details/42493683 http://blog.csdn.net/wujizhishang/article/de ...
- java的web配置文件的“<load-on-startup>的说明[转]
<servlet> <servlet-name>log4jInitServlet</servlet-name> <servlet-class>org.s ...
- Python爬虫实战七之计算大学本学期绩点
大家好,本次为大家带来的项目是计算大学本学期绩点.首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的 ...
- jdk、jre、jvm的区别联系
jdk包括以下三个东西: D:\Program Files\jdk1.7.0_21\bin\javac.exe和java.exe D:\Program Files\jdk1.7.0_21\jre D: ...
- CRISPR/Cas9基因敲除原理及实验建议
CRISPR/Cas9基因敲除原理及实验建议 CRISPR Cas9已经成为了最受欢迎的基因编辑技术之一,在2016年的国自然基金中也有很多项目是关于 CRISPR Cas9的.目前在市场上已经有 ...
- 4.4.1 CAS详解
一.什么是CAS CAS,compare and swap的缩写,中文翻译成比较并交换. 我们都知道,在java语言之前,并发就已经广泛存在并在服务器领域得到了大量的应用.所以硬件厂商老早就在芯片中加 ...
- YII2 rule exist unique
['mobile', 'exist', 'targetClass' => 'xmobile\modules\v1\models\BuyerList', 'message' => '当前用户 ...
- UVALive 7749 Convex Contour (计算几何)
题意:给定上正方形,圆,三角形,让你求出包围它的最短的路径. 析:首先,如果是这种情况 三角形 三角形 三角形 正方形(圆) 三角形 三角形 三角形 ..这一种就是直接从左边直接连到正方形(圆),也 ...
- C# 释放资源的规范写法
static class CSharp_3 { /* ---------------------------------------- * 以下学习资源的释放:IDispose和析构函数 * 1.ID ...