博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )
阅读量:4691 次
发布时间:2019-06-09

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

题意 : 给出坐标轴上的 n 个点的横坐标,要你选出最多的点,使得这些点两两距离是二的幂 ( 特殊情况 : 选出的集合只有一个点也满足条件 )

 

分析 :

官方题解已经说的很好了

最关键是是判断选出的集合元素数量肯定不可能大于 3

简单翻译一下题解就是

假设现有答案集合元素数量为 4 ,且令其为 a、b、c、d ( a < b < c < d )

令 a、b 间距为 dist(a, b) = 2^k

令 b、c 间距为 dist(b, c) = 2^l

则可得出 dist(a, c) = dist(a, b) + dist(b, c) = 2^k + 2^l = 2^m

根据二的幂相加的性质,可以得出 k == l ( !!!!! 这个思想很重要 !!!!!! )

对于 a、b、c 有如上关系,所以对于 b、c、d 也有同样的关系

所以有 dist(a, b) = dist(b, c) = dist(c, d) = 2^k

故有 dist(a, d) = 3 * 2^k 这个因为有因子 3 的存在,所以定不是二的幂

故推出答案集元素数量为 4 是不可行的,由此可以推广出 大于 4 的也都不可行 

所以只要枚举二的幂,然后对于每一个点去检查其加上或者减去当前枚举的二的幂的元素是否存在

若都存在,那么肯定存在答案集合大小为 3 的解。若只存在一个,则存在答案集合大小为 2 的解。

若枚举完了都没有的话,那么答案集合大小只能为 1 ,此时随便输出一个元素即可。

 

#include
#define LL long long#define ULL unsigned long long#define scs(i) scanf("%s", i)#define sci(i) scanf("%d", &i)#define scd(i) scanf("%lf", &i)#define scl(i) scanf("%lld", &i)#define scIl(i) scanf("%I64d", &i)#define scii(i, j) scanf("%d %d", &i, &j)#define scdd(i, j) scanf("%lf %lf", &i, &j)#define scll(i, j) scanf("%lld %lld", &i, &j)#define scIll(i, j) scanf("%I64d %I64d", &i, &j)#define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)#define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)#define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)#define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define lowbit(i) (i & (-i))#define mem(i, j) memset(i, j, sizeof(i))#define fir first#define sec second#define ins(i) insert(i)#define pb(i) push_back(i)#define pii pair
#define mk(i, j) make_pair(i, j)#define all(i) i.begin(), i.end()#define pll pair
#define _TIME 0#define _INPUT 0#define _OUTPUT 0clock_t START, END;void __stTIME();void __enTIME();void __IOPUT();using namespace std;const int maxn = 2e5 + 10;LL arr[maxn];int main(void){__stTIME();__IOPUT(); set
s; int n; sci(n); for(int i=1; i<=n; i++){ scIl(arr[i]); s.ins(arr[i]); } LL ans1, ans2, ans3; bool _3 = false; bool _2 = false; for(int i=0; i<=30; i++){ for(int j=1; j<=n; j++){ if(s.count(arr[j]+(1LL<
View Code

 

转载于:https://www.cnblogs.com/LiHior/p/9129063.html

你可能感兴趣的文章
python学习笔记-day7笔记
查看>>
Farseer.net轻量级开源框架 入门篇:普通逻辑层
查看>>
Java中看今天是星期几,礼拜几
查看>>
PAT1016
查看>>
初识JavaScript
查看>>
让easyui datagrid支持bootstrap的tooltip
查看>>
1.node.js安装
查看>>
方法/排序
查看>>
鼠标放在小图片上显示大图标
查看>>
Linux下Gcc生成和使用静态库和动态库详解
查看>>
JavaScript 中常见设计模式整理
查看>>
html 绘图渐变和图片填充
查看>>
微信退款 报错 SSL certificate not found: cert/apiclient_cert.pem
查看>>
leetcode力扣刷题系列python——1、两数之和
查看>>
SQL 统计整个服务器上各个数据库占用的空间
查看>>
浅析python日志重复输出问题
查看>>
Mahout之(三)相似性度量
查看>>
POJ 2367 Genealogical tree
查看>>
Spring boot 入门配置
查看>>
资料推荐--Google Java编码规范
查看>>