题目大意

可以理解成有n个木板,可以选取木板将其劈成2半(如果长度是奇数,就切成x和x+1),切完之后还可以再切

然后你要把这n个木板切成更多的木板,然后从中选择k个,使得这k个木板的最小长度尽量大

这个题有两种做法,不过都需要二分答案

先二分最小长度是x

第一种做法是 枚举n个木板,每一个都切到不能再切为止,然后统计有多少个木板,看能否符合

      统计过程中要记录两个值,因为一个木板不论切多少次,结果都只会存在两种木板,然后记录一下每次切是哪两种木板以及各有多少个,然后简单转移即可

      复杂度是nlog^2c

第二种做法是 类似dp的做法,dp[i]表示长度为i的木板有多少个,那么转移很简单,如果(i+1)/2仍不小于x,那么可以转移到dp[(i+1)/2]和dp[i/2]

      最后统计i大于x的dp[i]的值即可

      复杂度是clogc

一开始写的第一种做法,常数写渣了,TLE,好气啊orz

还是第二种做法比较神奇

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long LL;
int n, k;
int a[1000001];
LL dp[10000002];
bool can(int x)
{memset(dp, 0, sizeof(dp));for(int i = 0; i < n; i++) dp[a[i]]++;LL ans = 0;for(int i = 10000001; i >= max(x, 2); i--){if(dp[i]){if((i+1)/2 >= x){dp[i/2] += dp[i];dp[(i+1)/2] += dp[i];} elseans += dp[i];}}if(x == 1) ans += dp[1];return ans >= k;
}int main()
{cin>>n>>k;for(int i = 0; i < n; i++) scanf("%d", &a[i]);int l = 1, r = 1e7;while(l+1 < r){int mid = (l+r)>>1;if(can(mid)) l = mid;else r = mid;}if(!can(1)) cout<<"-1"<<endl;else{if(can(l+1)) cout<<l+1<<endl;else cout<<l<<endl;}
}

转载于:https://www.cnblogs.com/Saurus/p/6222441.html

Codeforces Round #389 (Div. 2) 752E(二分答案)相关推荐

  1. Codeforces Round #361 (Div. 2) C 二分

    链接:戳这里 C. Mike and Chocolate Thieves time limit per test2 seconds memory limit per test256 megabytes ...

  2. Codeforces Round #389 Div.2 C. Santa Claus and Robot

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  3. Codeforces Round #635 (Div. 2) D. Xenia and Colorful Gems 暴力 + 二分

    传送门 文章目录 题意: 思路: 题意: 给你三个数组a,b,ca,b,ca,b,c,让你从每个数组中选择一个数x,y,zx,y,zx,y,z,使得(x−y)2+(x−z)2+(y−z)2(x-y)^ ...

  4. Codeforces Round #593 (Div. 2) D. Alice and the Doll 暴力 + 二分

    传送门 文章目录 题意: 思路: 题意: 思路: 还以为这个题有什么高深的算法,结果就是个暴力. 由于n∗mn*mn∗m达到了1e101e101e10的级别,所以直接暴力肯定是不行的,考虑有很多空格, ...

  5. Codeforces Round #725 (Div. 3) G. Gift Set 二分

    传送门 文章目录 题意: 思路: 题意: 有两种物品分别有x,yx,yx,y个,每次可以从一个拿出aaa个,另一个拿出bbb个分成一组,问最多能分成多少组. 思路: 这个题有一个显然的单调性,所以二分 ...

  6. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  7. Codeforces Round #739 (Div. 3)(AK实况)

    Codeforces Round #739 (Div. 3) A. Dislike of Threes 找到第kkk个既不是333的倍数,个位数上也不是333的数,也已预处理然后O(1)O(1)O(1 ...

  8. Codeforces Round #653 (Div. 3)(A, B, C, D, E1详解)

    Codeforces Round #653 (Div. 3) Required Remainder Thinking(binary search) 既然是找最大值问题,我又懒得去推式子,于是我直接就上 ...

  9. Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

    传送门 题意: 有一颗nnn个节点的树,其中一个简单路径集合被称为kkk合法当且仅当: 树的每个节点至多属于一条路径,且每条路径恰好包含kkk个点. 对于k∈[1,n]k\in [1,n]k∈[1,n ...

  10. Codeforces Round #741 (Div. 2) D2. Two Hundred Twenty One (hard version) 前缀和 + 分段模型

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,+++代表111,−-−代表−1-1−1,让后有qqq个询问,每次询问[l,r][l,r][l,r]区间,将这段区间的数拿出来,设为 ...

最新文章

  1. MongoDB:快速入门,掌握这些刚刚好!
  2. 微服务架构的优势与不足
  3. awstats的安装和配置
  4. div在最顶层显示----弹出框效果
  5. 免费获取半年 Bitdefender Total Security 2014
  6. 【cmd】windows cmd 中判断命令执行成功
  7. DataGrid 完全攻略之四 (实现统计)
  8. html中删除代码怎么写,html空格代码怎么写?
  9. 线性最小二乘法的通俗理解
  10. AI圣经《深度学习》作者斩获2018年图灵奖,100 万奖励!
  11. QQ隐藏福利二-----------------那些免费的挂件和气泡
  12. shawn0102_播客:留下每年35万美元的工作以学习编码-Shawn Wang访谈
  13. 【渝粤教育】 国家开放大学2020年春季 1132卫生管理 参考试题
  14. Cannot find module ‘node-sass‘问题解决
  15. 数据挖掘 顶级期刊_数据挖掘顶级期刊简介_47209.doc
  16. matlab中生成随机正交矩阵
  17. C++中两个unsigned型数值相减
  18. kafka监控api,手撕面试官
  19. 公信宝区块链技术和应用白皮书
  20. 注册会计可以用计算机,注册会计师考试能带科学计算器吗?

热门文章

  1. npm的一些常用命令
  2. Android 定位地理坐标体系
  3. UIDynamic(物理仿真)
  4. Route@简单应用
  5. Power Tools for TFS 11 Beta
  6. 求一个序列中,第k个数
  7. Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)...
  8. Cocos文档案例游戏设计的梳理与分析
  9. 利用PyCharm进行Python远程调试
  10. 【状压DP】OpenJ_POJ - C17K Lying Island