前置知识

meet in middle (折半搜索)

会的大佬请跳过

不会的请自己前往oi wiki或CSDN(百度吧,少年)

解题思路

纯暴力

  看完题目考虑将每一种情况计算出来,排序后找不超过T的最大值

  因为每个数有(选/不选)两种情况

  所以总共2^n种结果

  显而易见,时间复杂度 O(2^n)

  n=40时,显然会G

正解

引出

暴力思路告诉我们,现在需要一种优秀的算法(奇技淫巧)来帮助我们

从庞大的信竞知识中,我们找到了折半搜索;

步骤

  1. 将数据分成2组,1到n/2一组,n/2+1到n为一组
  2. 每组单独算情况,存在数组中
  3. 两个结果数组单独排序(升序)
  4. a指针从第一组结果数组的第一个元素,b指针从第二组结果数组的最后一个元素(没学过指针怎么办?变量模拟即可,详见代码)
  5. 如果两个元素之和大于T,b--
  6. 否则用元素之和更新答案(正确性显然,自己思考)

    AC代码

    #include <bits/stdc++.h>
    using namespace std;
    long long n,t,mx,sz[42],a[1050000],b[1050000],tota,totb;
    void dfs(int qd,int zd,int lim,long long zhi)
    {
    if(qd>zd)return ;
    if(zhi+sz[qd]>t)
    {
    dfs(qd+1,zd,lim,zhi);
    return;
    }
    if(lim==1)a[++tota]=zhi+sz[qd];
    else b[++totb]=zhi+sz[qd];
    dfs(qd+1,zd,lim,zhi);
    dfs(qd+1,zd,lim,zhi+sz[qd]);
    return;
    }
    int main()
    {
    scanf("%lld%lld",&n,&t);
    for(int i=1;i<=n;i++)
    {
    scanf("%lld",&sz[i]);
    }
    dfs(1,n/2,1,0);
    dfs(n/2+1,n,2,0);
    sort(a+1,a+tota+1);
    sort(b+1,b+totb+1);
    int zz=1,yz=totb;
    while(zz<=tota&&yz>=1)
    {
    while(a[zz]+b[yz]>t)yz--;
    if(yz<1)break;
    if(a[zz]+b[yz]>mx)mx=a[zz]+b[yz];
    zz++;
    }
    printf("%lld\n",max(mx,max(a[tota],b[totb])));
    return 0;
    }

    写在最后

    求审核放过孩子的第一篇正经题解

欢迎各位大佬评论区指点一二,三克油

[ABC184F] Programming Contest题解的更多相关文章

  1. 2015 Syrian Private Universities Collegiate Programming Contest 题解

    题目在这里>_< 发现这场比赛在网上没有完整的题解,甚至连题目代码都没人贴出来(大概是因为题目太水了吧...).所以宝宝就来写个题解,也就当作成长记录了233333 A. Window 题 ...

  2. 2015 ACM Amman Collegiate Programming Contest 题解

    [题目链接] A - Who Is The Winner 模拟. #include <bits/stdc++.h> using namespace std; int T; int n; s ...

  3. 2013-2014 ACM-ICPC Brazil Subregional Programming Contest 题解

    [题目链接] 这场比赛题面英文都好长... ... A - Zero or One 模拟. #include <bits/stdc++.h> using namespace std; in ...

  4. 2017, X Samara Regional Intercollegiate Programming Contest 题解

    [题目链接] A - Streets of Working Lanterns - 2 首先将每一个括号匹配串进行一次缩减,即串内能匹配掉的就匹配掉,每个串会变成连续的$y$个右括号+连续$z$个左括号 ...

  5. 2017 ACM Amman Collegiate Programming Contest 题解

    [题目链接] A - Watching TV 模拟.统计一下哪个数字最多即可. #include <bits/stdc++.h> using namespace std; const in ...

  6. The 2015 China Collegiate Programming Contest Game Rooms

    Game Rooms Time Limit: 4000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  7. Programming Contest Ranking(题解)

    Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...

  8. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

  9. M-SOLUTIONS Programming Contest 2020 题解

    M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...

  10. 2016 Sichuan Province Programming Contest

    2016 Sichuan Province Programming Contest 代码 2016 Sichuan Province Programming Contest A. Nearest Ne ...

随机推荐

  1. vue+vant实现省市联动(van-area)组件(包含比较全面的全国省市数组数据)

    组件库太香了,人家nb,自己写的都是** 效果: 1.安装vant库以及main.js的配置 2.一般结合van-popup组件 </template> <van-popup v-m ...

  2. python3解析FreeSWITCH会议室列表信息

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.12 进行FreeSWITCH会议室相关功能开发过程中,会遇到需要解析会议室列表信息并进行 ...

  3. 二:飞凌嵌入式FCU1201

    场景一 充电基础设施 场景二 现代机械加工对复杂化.精密化.大型化以及自动化设备的要求不断提高,数控机床设备日益得到广泛应用.数控机床设备对加工质量及效率起着关键乃至核心作用,其造价往往相当昂贵.因此 ...

  4. 如何基于surging跨网关跨语言进行缓存降级

    概述 surging是一款开源的微服务引擎,包含了rpc服务治理,中间件,以及多种外部协议来解决各个行业的业务问题,在日益发展的今天,业务的需求也更加复杂,单一语言也未必能抗下所有,所以在多语言行业解 ...

  5. (更新中)Python、JavaScript、Java和C++语言的语法对比与梳理

    目录 引言 1. 构造函数 Python JavaScript Java C++ 2. 构造类 Python JavaScript Java C++ 3. 总结 引言 在开发过程中不免需要用到多种编程 ...

  6. Docker基础 ubuntu安装docker

    目录 如何在Linux深度系统deepin下安装docker 介绍 安装docker 在ubuntu的docker中运行ubuntu 在ubuntu的docker中运行centos 卸载docker ...

  7. ansible系列(30)--ansible的role详解

    目录 1. Ansible Roles 1.1 roles目录结构 1.2 roles编写步骤 1.2.1 编写基本的roles 1.2.2 roles的调用 1.2.3 roles中使用变量 1.2 ...

  8. 如何修改npm包源码后,重新npm包的时候能是修改后的版本

    肯定是clone一份到gitHub啦 保存一份修改后的npm包到自己的私有库 npm 安装 git 仓库的方式 npm install <git remote url> 例如 npm in ...

  9. VNC远程控制软件是什么?有没有更好的远程桌面控制解决方案?

    看官老爷们,你们是否需要远程访问或远程支持解决方案?来了解下VNC吧. 什么是VNC? VNC是虚拟网络计算(VNC)是一种远程桌面共享技术,用于从世界任何地方远程访问和控制计算机. VNC的工作原理 ...

  10. 网络数据流分析工具TcpEngine V1.0.0教程-1

    概述 目前主流的网络数据分析工具主要有两类,一类是http协议分析工具,如fiddler,这类工具擅长对字符串类型协议分析:另一类是原始网络数据包的监听分析,如Wireshark,这类工具擅长分析网络 ...