Codeforces Round #389 (Div. 2) 752E(二分答案)
题目大意
可以理解成有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(二分答案)相关推荐
- Codeforces Round #361 (Div. 2) C 二分
链接:戳这里 C. Mike and Chocolate Thieves time limit per test2 seconds memory limit per test256 megabytes ...
- 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 ...
- 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)^ ...
- Codeforces Round #593 (Div. 2) D. Alice and the Doll 暴力 + 二分
传送门 文章目录 题意: 思路: 题意: 思路: 还以为这个题有什么高深的算法,结果就是个暴力. 由于n∗mn*mn∗m达到了1e101e101e10的级别,所以直接暴力肯定是不行的,考虑有很多空格, ...
- Codeforces Round #725 (Div. 3) G. Gift Set 二分
传送门 文章目录 题意: 思路: 题意: 有两种物品分别有x,yx,yx,y个,每次可以从一个拿出aaa个,另一个拿出bbb个分成一组,问最多能分成多少组. 思路: 这个题有一个显然的单调性,所以二分 ...
- Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...
- Codeforces Round #739 (Div. 3)(AK实况)
Codeforces Round #739 (Div. 3) A. Dislike of Threes 找到第kkk个既不是333的倍数,个位数上也不是333的数,也已预处理然后O(1)O(1)O(1 ...
- Codeforces Round #653 (Div. 3)(A, B, C, D, E1详解)
Codeforces Round #653 (Div. 3) Required Remainder Thinking(binary search) 既然是找最大值问题,我又懒得去推式子,于是我直接就上 ...
- 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 ...
- Codeforces Round #741 (Div. 2) D2. Two Hundred Twenty One (hard version) 前缀和 + 分段模型
传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串,+++代表111,−-−代表−1-1−1,让后有qqq个询问,每次询问[l,r][l,r][l,r]区间,将这段区间的数拿出来,设为 ...
最新文章
- MongoDB:快速入门,掌握这些刚刚好!
- 微服务架构的优势与不足
- awstats的安装和配置
- div在最顶层显示----弹出框效果
- 免费获取半年 Bitdefender Total Security 2014
- 【cmd】windows cmd 中判断命令执行成功
- DataGrid 完全攻略之四 (实现统计)
- html中删除代码怎么写,html空格代码怎么写?
- 线性最小二乘法的通俗理解
- AI圣经《深度学习》作者斩获2018年图灵奖,100 万奖励!
- QQ隐藏福利二-----------------那些免费的挂件和气泡
- shawn0102_播客:留下每年35万美元的工作以学习编码-Shawn Wang访谈
- 【渝粤教育】 国家开放大学2020年春季 1132卫生管理 参考试题
- Cannot find module ‘node-sass‘问题解决
- 数据挖掘 顶级期刊_数据挖掘顶级期刊简介_47209.doc
- matlab中生成随机正交矩阵
- C++中两个unsigned型数值相减
- kafka监控api,手撕面试官
- 公信宝区块链技术和应用白皮书
- 注册会计可以用计算机,注册会计师考试能带科学计算器吗?