题目链接

传送门

题意

给你\(n\)个数,每个数表示\(\frac{1}{2^{a_i}}\),要你把这\(n\)个数分为两堆,使得每堆的和都大于等于\(\frac{1}{2}\)。

思路

首先我们假设第一堆的下标为\(x_1,x_2\dots,x_n\),且\(2^{a_{x_1}}\leq 2^{a_{x_2}}\leq\dots\leq 2^{a_{x_n}}\),则:

\[\begin{aligned}
&\sum\limits_{i=1}^{n}\frac{1}{2^{a_{x_i}}}&\\
=&\sum\limits_{i=1}^{n}\frac{2^{a_{x_n}-a_{x_i}}}{2^{a_{x_n}}}\text{(通分)}&
\end{aligned}
\]

我们知道\(2\)个\(2^x\)构成一个\(2^{x+1}\),因此我们确定每一堆分母的最大值后按照\(2^{a_{x_i}}\)从小到大来凑\(2^{a_{x_n}-1}\)。

注意,一旦相邻两个数的大小差值大于等于\(17\)就直接不用取输出\(NO\),因为\(2^{17}\geq 10^5\),后面不管怎么凑都是不可能凑出我们所需要的数的。

代码实现如下

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std; typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> pil;;
typedef pair<int, int> pii;
typedef unsigned long long uLL; #define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("D://Code//in.txt","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0) const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL; int t, n;
int vis[maxn]; struct node {
int val, id;
bool operator < (const node& x) const {
return val < x.val;
}
}a[maxn]; int main() {
#ifndef ONLINE_JUDGE
FIN;
#endif // ONLINE_JUDGE
scanf("%d", &t);
int icase = 0;
while(t--) {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i].val);
a[i].id = i;
vis[i] = 0;
}
printf("Case %d: ", ++icase);
sort(a + 1, a + n + 1);
LL nw;
if(a[1].val == 1) {
vis[a[1].id] = 1;
} else {
nw = a[1].val - 1;
if(nw >= 17) {
printf("NO\n");
continue;
}
nw = (1<<nw) - 1;
vis[a[1].id] = 1;
for(int i = 2; i <= n; ++i) {
if(nw == 0) break;
if(a[i].val == a[i-1].val) --nw, vis[a[i].id] = 1;
else {
if(a[i].val - a[i-1].val >= 17) {
break;
}
nw = nw * (1<<(a[i].val - a[i-1].val)) - 1;
if(nw > n - i) break;
vis[a[i].id] = 1;
}
}
if(nw != 0) {
printf("NO\n");
continue;
}
}
int idx = -1;
for(int i = 1; i <= n; ++i) {
if(!vis[a[i].id]) {
idx = i;
break;
}
}
if(idx == -1) {
printf("NO\n");
continue;
}
if(a[idx].val == 1) {
printf("YES\n");
for(int i = 1; i <= n; ++i) {
printf("%d", vis[i]);
}
printf("\n");
} else {
nw = a[idx].val - 1;
if(nw >= 17) {
printf("NO\n");
continue;
}
nw = (1<<nw) - 1;
for(int i = idx + 1; i <= n; ++i) {
if(nw == 0) break;
if(vis[a[i].id]) continue;
if(a[i].val == a[i-1].val) --nw;
else {
if(a[i].val - a[i-1].val >= 17) {
break;
}
nw = nw * (1<<(a[i].val - a[i-1].val)) - 1;
if(nw > n - i) break;
}
}
if(nw != 0) {
printf("NO\n");
continue;
}
printf("YES\n");
for(int i = 1; i <= n; ++i) {
printf("%d", vis[i]);
}
printf("\n");
}
}
return 0;
}

Justice(HDU6557+2018年吉林站+二进制)的更多相关文章

  1. 2018 CCPC 吉林站 H Lovers

    2018 CCPC 吉林站 H Lovers 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, ...

  2. Strength(HDU6563+2018年吉林站+双指针瞎搞)

    题目链接 传送门 题意 你有\(n\)只怪,每只怪的伤害为\(a_i\),对手有\(m\)只怪,每只怪的伤害为\(b_i\),对手的怪有普通状态和防守状态(普通状态:如果你用攻击力为\(a_i(a_i ...

  3. Lovers(HDU6562+线段树+2018年吉林站)

    题目链接 传送门 题意 初始时有\(n\)个空串,然后进行\(q\)次操作,操作分为以下两种: wrap l r x:把\(l,r\)中的每个字符串的首尾都加入\(x\),如\(s_i=121,x=3 ...

  4. The Tower(HDU6559+2018年吉林站+数学)

    题目链接 传送门 题意 告诉你圆锥的底部圆的半径和圆锥的高,再给你一个点的坐标及其运动向量,问你这个点什么时候会与这个圆锥相撞. 思路 比赛场上二分一直没过但是有人二分过了,今天再写这题想再试下二分, ...

  5. 2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)

    http://acm.hdu.edu.cn/showproblem.php?pid=6562 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, 使得这个数变成 dsiddsid的形式 ...

  6. 2018年9月22日CCPC吉林站参赛总结

    发现思维题是硬伤,代码能力是硬伤,对知识点的理解不深刻是硬伤 接下来要做的就是 1.熟悉每一个知识点,把每一个知识点和实现它的代码联系在一起学习 2.多见题,看看他们是怎么考察这些知识点的,等比赛的时 ...

  7. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  8. CCPC吉林站

    A.The Fool #include <bits/stdc++.h> using namespace std; inline int read() { ,f=;char ch=getch ...

  9. 2018 CCPC 桂林站(upc复现赛)总结

    比赛一开始盯上了A题和G题,一个小时过去了还没有出题,心里有些乱.这时我看D题很多人过了,于是宝儿去看D题,说D题简单,转化成二进制暴力,于是就去做了.写的时候好像思路有点卡,WA了一发,后来马上发现 ...

随机推荐

  1. Angular2 输入完成后触发函数

    (blur)="keySearch($event)" ,鼠标点击其他地方触发 keySearch(e): void { var dom = $(e.target); var key ...

  2. CentOS 7 编译安装clang+llvm

    天在CentOS上将最新版本的LLVM套件(LLVM,Clang和Libc++)编译安装好了,中间遇到了不少问题.虽然已经有很多博客介绍如何编译安装LLVM了,但是根据我自己亲身体验的情况来看,还是有 ...

  3. Windows 7 下使用gitblit + git 搭建小组内文件版本控制环境

    一.GitBlit下载及配置 使用前先看下GitBlit的百科介绍,很简洁:需要java运行环境:是一个纯 Java 库用来管理.查看和处理Git 资料库.即一个基于Java的分布式版本控制系统. 1 ...

  4. Python实现树

    树 (tree) 是一种非常高效的非线性存储结构.树,可以很形象的理解,有根,有叶子,对应在数据结构中就是根节点.叶子节点,同一层的叶子叫兄弟节点,邻近不同层的叫父子节点,非常好理解. 注:定义来自百 ...

  5. ACM算法锦集

    一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中 ...

  6. 小白的C++之路——结构体

    结构体与数组不同的是结构体能包含不同类型的数据,像一个综合性的仓库,更加灵活. #include <iostream> #include <string> #include & ...

  7. cloudera cdh6.3 离线安装 经典大数据平台视频教程(含网盘下载地址)

    cdh6.3企业级大数据视频教程 链接:https://pan.baidu.com/s/1bLGrIwzpFQB-pQRb6KOmNg 提取码:i8h8 系统和软件版本1,操作系统:Centos7.6 ...

  8. Dockerfile构建jar镜像

    dockerDockerfilejar包docker-compose 一.安装docker和compose 二.准备jar包 三.编写配置文件 1. Dockerfile 2. docker-comp ...

  9. 设计模式--Bulider模式

    起因:最近在做统计计算,创建的实体中属性比较多,都是一些数值,一开始是通过get.set方法进行赋值,占用了很多业务代码方法的长度,可读性不太好,后来改用了添加构造器的方式,稍显精简了一点,但是每次赋 ...

  10. 【开发笔记】- 在Windows环境下后台启动redis

    1. 进入 DOS窗口 2. 在进入Redis的安装目录 3. 输入:redis-server --service-install redis.windows.conf --loglevel verb ...