博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1563 坐标轴上的最大团(今日gg模拟第一题) | 线段覆盖 贪心 思维题
阅读量:5327 次
发布时间:2019-06-14

本文共 1498 字,大约阅读时间需要 4 分钟。

坐标轴上的最大团

坐标轴上有n个点,每个点有一个权值。第i个点的坐标是 xi ,权值是 wi 。现在对这些点建图。对于点对 (i,j) ,如果 |xi−xj|≥wi+wj ,那么就给第i个点和第j个点之间连一条边。

问建好的图中最大团有几个点。
样例解释:
08D2CB7451B68EFD0000000000000017.png
Input
单组测试数据。
第一行有一个整数n (1≤n≤200000),表示坐标轴上有n个点。
接下来n行,每一行有两个整数xi, wi (0≤xi≤10^9,1≤wi≤10^9),表示第i个点的坐标和权值。
所有的xi是不一样的。
Output
输出一个整数,表示最大团中有几个点。
Input示例
样例输入1
4
2 3
3 1
6 1
0 2
Output示例
样例输出1
3

把一个点表示为一个区间\([x_i - w_i, x_i + w_i]\),那么没有重合的两个线段之间就会有边,所以选则没有重合的最多线段就好——熟悉的线段覆盖!

#include 
#include
#include
using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define space putchar(' ')#define enter putchar('\n')template
bool read(T &x){ char c; bool op = 0; while(c = getchar(), c < '0' || c > '9') if(c == '-') op = 1; else if(c == EOF) return 0; x = c - '0'; while(c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; if(op) x = -x; return 1;}template
void write(T x){ if(x < 0) putchar('-'), x = -x; if(x >= 10) write(x / 10); putchar('0' + x % 10);}const int N = 200005;int n, ans;struct range{ int l, r; bool operator < (const range &b) const{ return r < b.r; }} a[N];int main(){ read(n); for(int i = 1, x, w; i <= n; i++) read(x), read(w), a[i] = (range){x - w, x + w}; sort(a + 1, a + n + 1); for(int i = 1, r = 0x80000000; i <= n; i++) if(a[i].l >= r) ans++, r = a[i].r; write(ans), enter; return 0;}

转载于:https://www.cnblogs.com/RabbitHu/p/51nod1563.html

你可能感兴趣的文章
手机前端框架UI库(Frozen UI、WeUI、SUI Mobile)
查看>>
正则RegExp
查看>>
跨域的方式总结
查看>>
TIP
查看>>
<转载>PHP的静态变量介绍
查看>>
HTML认识一
查看>>
Activity生命周期
查看>>
MFCC常用类介绍
查看>>
插入排序及使用二分查找优化
查看>>
关于python 输出中文
查看>>
java获取静态页面内容
查看>>
8.信号量
查看>>
22.监视文件
查看>>
算法入门
查看>>
Power Strings POJ - 2406,字符串hash
查看>>
Git发生SSL certificate problem: certificate ha错误的解决方法
查看>>
字符串题目
查看>>
NYOJ458 - 小光棍数
查看>>
java中常用方法
查看>>
【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
查看>>