前置知识

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. 利用python爬取某壳的房产数据

    以无锡的某壳为例进行数据爬取,现在房子的价格起伏很快,买房是人生一个大事,了解本地的房价走势来判断是否应该入手. (建议是近2年不买,本人在21年高位抛了一套房,基本是通过贝壳数据判断房价已经到顶,希 ...

  2. docker安装Mysql挂载数据卷 实现容器配置本地化

    目录 一.安装docker 二.docker安装MySQL 安装5.7.31版本的mysql navicat 连接mysql 安装mysql:8 三.设置开机自动启动容器 Docker快速创建MySQ ...

  3. Java面试题:线程池内“闹情绪”的线程,怎么办?

    在Java中,线程池中工作线程出现异常的时候,默认会把异常往外抛,同时这个工作线程会因为异常而销毁,我们需要自己去处理对应的异常,异常处理的方法有几种: 在传递的任务中去处理异常,对于每个提交到线程池 ...

  4. C语言:算法题判断是否有效字符({[]})---括号

    给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效. 有效字符串需满足:                  左括号必须用相同类型的右括号闭合.       ...

  5. 我发现了字节OpenApi接口的bug!

    本文记录我在对接字节旗下产品火山云旗下云游戏产品 OpenApi 接口文档时遇到的坑,希望能帮助大家(火山云旗下云游戏产品的文档坑很多,我算是从零到一都踩了一遍,特此记录,希望大家引以为鉴). 1. ...

  6. 鸿蒙HarmonyOS实战-Stage模型(服务卡片的模块和创建)

    一.服务卡片的模块和创建 在HarmonyOS中,服务卡片是一种提供即时信息和快速操作的小组件,类似于Android中的通知栏.服务卡片可以显示各种类型的信息,包括通知.天气.日历事件.音乐播放器.快 ...

  7. opensips开启lua支持

    操作系统 :CentOS 7.6_x64 opensips版本 :2.4.9 lua版本:5.1 今天整理下CentOS7环境下opensips2.4.9的lua模块笔记及使用示例,并提供运行效果截图 ...

  8. Swoole 源码分析之 Timer 定时器模块

    原文首发链接:Swoole 源码分析之 Timer 定时器模块 大家好,我是码农先森. 引言 Swoole 中的毫秒精度的定时器.底层基于 epoll_wait 和 setitimer 实现,数据结构 ...

  9. Vue cli之在组件中使用axios

    默认情况下,我们的项目中并没有对axios包的支持,所以我们需要下载安装. 在项目根目录中使用 npm安装包: npm install axios 接着在main.js文件中,导入axios并把axi ...

  10. CSS——引入方式

    1.行内式 <div style="color: white;background-color: #369;text-align: center">行内设置</d ...