codeforces 807 E. Prairie Partition(贪心+思维)
题目链接:http://codeforces.com/contest/807/problem/E
题意:已知每个数都能用x=1 + 2 + 4 + ... + 2k - 1 + r (k ≥ 0, 0 < r ≤ 2k)来表示,
给出一串数字问这串数字能有几个x表示。输出可能的长度。
题解:这题比较巧妙具体还是看代码理解一下,不好解释。
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
typedef long long ll;
const int M = 1e5 + 10;
ll a[M];
vector<int>equ , betw , ans;//equ[i]表示a[i]中有几个2^i,betw[i]表示a[i]中有几个大于等于2^(i-1)小于2^(i)的数。ans用来存结果。
bool Is(int len) {
vector<int>e , b;
e = equ , b = betw;
if(e[0] < len) return false;//如果1的数量比长度少显然不可能组成。
b[1] += e[0] - len;//把多余的a[i]用到b[i+1]中。
for(int i = 1 ; i < 41 ; i++) {
if(b[i] > len) return false;//显然b[i]如果比长度还多那么也是不存在的。
if(e[i] > len) b[i + 1] += (e[i] - len);//把多余的a[i]用到b[i+1]中。
else if(e[i] < len) {
b[i] -= (len - e[i]);
b[i] = max(0 , b[i]);
len = e[i];//由于b[i]放上去后这串数就不能再放a了所以要更新一下len
}
b[i + 1] += b[i];//把多余的b加上,后面可以用。
}
return true;
}
int main() {
int n;
scanf("%d" , &n);
ans.clear() , equ.clear() , betw.clear();
for(int i = 1 ; i <= n ; i++) {
scanf("%lld" , &a[i]);
}
int po = 0;
for(int i = 0 ; i < 42 ; i++) {
equ.push_back(0);
betw.push_back(0);
}
for(int i = 1 ; i <= n ; i++) {
while(a[i] > ((ll)1 << po)) {
po++;
}
if(a[i] == ((ll)1 << po)) {
equ[po]++;
}
else {
betw[po]++;
}
}
for(int i = 1 ; i <= n ; i++) {
if(Is(i)) {
ans.push_back(i);
}
}
if(ans.size()) {
for(int i = 0 ; i < ans.size() ; i++) {
printf("%d " , ans[i]);
}
}
else {
printf("-1");
}
printf("\n");
return 0;
}
codeforces 807 E. Prairie Partition(贪心+思维)的更多相关文章
- codeforces 233 C. Cycles(贪心+思维)
题目链接:http://codeforces.com/contest/233/problem/C 题意:在一个无相图中有N个长度为3 的回路,输出符合条件的图.注意此图的节点数不得超过100 题解:贪 ...
- Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) E. Prairie Partition 二分+贪心
E. Prairie Partition It can be shown that any positive integer x can be uniquely represented as x = ...
- Codeforces Round #546 (Div. 2) D 贪心 + 思维
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...
- 贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas
题目传送门 /* 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0 ...
- Mike and distribution CodeForces - 798D (贪心+思维)
题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...
- [Codeforces 1214A]Optimal Currency Exchange(贪心)
[Codeforces 1214A]Optimal Currency Exchange(贪心) 题面 题面较长,略 分析 这个A题稍微有点思维难度,比赛的时候被孙了一下 贪心的思路是,我们换面值越小的 ...
- codeforces Gym 100338E Numbers (贪心,实现)
题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...
- 贪心/思维题 UVA 11292 The Dragon of Loowater
题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...
- T - Posterized(贪心思维)
Description Professor Ibrahim has prepared the final homework for his algorithm’s class. He asked hi ...
随机推荐
- Iterator-Java
在Java中,Iterator的作用就是为了方便处理集合中的元素.例如获取和删除集合中的元素. 在JDK8,Iterator接口提供了如下方法: 迭代器Iterator最基本的两个方法是next()和 ...
- git项目版本处理--远程分支重新拉取本地代码如何处理
最近在eclipse 上用git拉取分支,提交代码因为提交代码提交了一些配置文件造成 后续同事提交代码一直出现代码冲突问题 项目老大又重新拉取了一条代码 同样的分支名字 当时有点蒙不知道接着怎么弄:场 ...
- Java性能权威指南读书笔记--之一
JIT(即时编译) 解释型代码:程序可移植,相同的代码在任何有适当解释器的机器上,都能运行,但是速度慢. 编译型代码:速度快,电视不同CPU平台的代码无法兼容. java则是使用java的编译器先将其 ...
- Activiti6系列(2)- 运行和编译
前言 Activiti6.0在官网已经无法下载了,需要在Github上下载. 下载地址: https://github.com/Activiti/Activiti/releases/download/ ...
- JAVA基础知识(九)Java 异常
Throwable是Error和Exception的基类 Exception(异常) :是程序本身可以处理的异常. Error(错误): 是程序无法处理的错误.这些错误表示故障发生于虚拟机自身.或者发 ...
- Ubuntu 16.04 硬盘安装
自己的宏碁4741G 笔记本,已经用了6年了,最近感觉越来越慢,晚上突然想起装个Linux 玩玩,说干就干,选择了用户比较多的Ubuntu,网上下载16.04的版本,结合网上搜索到的安装教程,看似简单 ...
- SprintBoot
简述 推出时间:从Maven仓库的时间看是2016.7.28 目的:摆脱大量的XML配置文件以及复杂的Bean依赖关系,快速.敏捷地开发新一代基于Spring框架的应用程序 思想:约定优于配置(con ...
- .Net Core 最优 MD5 打开方式!初学者建议收藏(支持 SHA1,SHA256,.Net Framework)
public static string GetMd5Hash(string input) { using (MD5 md5Hash = MD5.Create()) { // Convert the ...
- 通过注解实现通用导出Excel
Javaweb开发中数据的导入导出很常见,每次我们都需要写很多代码,所以我就在想能不能写一些通用的方法,之前已经在网上 整理过一些通用的方法,最近在网上看到一位牛人封装的更加简介,自己拿过来整理了一下 ...
- c# 读取 txt 文件中数据(int)
今天在学图的算法做测试是,需要读取文本文件中的点坐标,本来很简单的事情,折腾了半天,记录一下找到的一种简单粗暴的解决方法,以便以后查看. 第一种方法 : StringReader string lin ...