当前位置: 首页 > news >正文

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];
            } else
            ans += 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

相关文章:

  • Oracle函数-单行函数-字符单行函数
  • JavaScript的apply()方法和call()方法
  • apache http server 开启ssl 与tomcat交互
  • 国际直拨电话号码格式
  • Spring-boot-admin功能说明
  • Linux 进程与线程六
  • UML课程复习重点
  • 前端面试通关指南
  • 网络广告计费方式常用术语
  • sails 跨域请求处理 -- config.cors
  • memcache命令
  • openlayers 3监听地图分辨率变化事件
  • Jython开发环境搭建
  • 【树莓派】树莓派网络对时间,时间调整
  • CodeDom系列四--Code生成
  • @jsonView过滤属性
  • 【347天】每日项目总结系列085(2018.01.18)
  • iOS 系统授权开发
  • js算法-归并排序(merge_sort)
  • Netty源码解析1-Buffer
  • SegmentFault 2015 Top Rank
  • SQLServer之索引简介
  • 产品三维模型在线预览
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用 @font-face
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用Gradle第一次构建Java程序
  • 系统认识JavaScript正则表达式
  • No resource identifier found for attribute,RxJava之zip操作符
  • 阿里云服务器如何修改远程端口?
  • 昨天1024程序员节,我故意写了个死循环~
  • ​ArcGIS Pro 如何批量删除字段
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #NOIP 2014# day.2 T2 寻找道路
  • (4)事件处理——(7)简单事件(Simple events)
  • (ZT)薛涌:谈贫说富
  • (学习日记)2024.01.09
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)详解PHP处理密码的几种方式
  • (转载)hibernate缓存
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net 路由处理厉害了
  • .net6使用Sejil可视化日志
  • .NET框架
  • .skip() 和 .only() 的使用
  • @html.ActionLink的几种参数格式
  • @Not - Empty-Null-Blank
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @Resource和@Autowired的区别
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [android] 手机卫士黑名单功能(ListView优化)