首页 > 其他分享 >洛谷 P5194 [USACO05DEC]Scales S 折半搜索

洛谷 P5194 [USACO05DEC]Scales S 折半搜索

时间:2022-10-10 12:55:35浏览次数:81  
标签:折半 洛谷 Scales int sum tot 砝码 return border

题目

https://www.luogu.com.cn/problem/P5194

思路

\(n \leq 1000\)的范围很吓人,但是按照【每个砝码的质量至少等于前面两个砝码的质量的和】的规则,打表可知n在50时总重量就已经超过了\(2^{30}\)。

于是大胆得出\(n \leq 50\)

因为数据不下降,于是将n个砝码从中间断开,分别搜索出前后\(n/2\)个砝码对应组成的总重量方案数\(a_{cnt}\)和\(b_{tot}\)。

将\(b_{tot}\)排序,枚举\(a_{cnt}\)中的每一个方案,在\(b_{tot}\)中用寻找第一个小于等于c-a[i]的方案数,不断更新答案即可。

dfs复杂度\(O(2^{n/2})\),二分查找复杂度\(O(nlogn)\)

总复杂度\(O(2^{n/2+1}+nlogn)\)

Code

#include<iostream>
#include<cstdio>
#include<algorithm>

const int maxn = (1 << 25) + 10;
const int maxm = 50;
int a[maxn], b[maxn];//储存两段搜索的方案数
int num[maxm];
int n, c, ans;
int cnt, tot;

void dfs1(int x, int sum, int border) {
    if (sum > c) return;
    if (x > border) {
        a[++cnt] = sum;
        return;
    }
    dfs1(x + 1, sum + num[x], border);
    dfs1(x + 1, sum, border);
}

void dfs2(int x, int sum, int border) {
    if (sum > c) return;
    if (x > border) {
        b[++tot] = sum;
        return;
    }
    dfs2(x + 1, sum + num[x], border);
    dfs2(x + 1, sum, border);
}

int main() {
    scanf("%d%d", &n, &c);
    for (int i = 1; i <= n; i++) scanf("%d", &num[i]);
    dfs1(1, 0, n / 2);
    dfs2(n / 2 + 1, 0, n);
    std::sort(b + 1, b + 1 + tot);
    for (int i = 1; i <= cnt; i++) {
        int curr = std::upper_bound(b + 1, b + 1 + tot, c - a[i]) - b - 1;
        ans = std::max(ans, a[i] + b[curr]);
    }
    std::cout << ans;
    return 0;
}

标签:折半,洛谷,Scales,int,sum,tot,砝码,return,border
From: https://www.cnblogs.com/MrWangnacl/p/16775278.html

相关文章

  • 【做题笔记】洛谷P5584 【SWTR-01】Sunny's Crystals
    ProblemP5584【SWTR-01】Sunny'sCrystals题目大意:给你一个长度为\(n\)的序列,每次可以删掉下标为\(2\)的非负整数次幂的数,删掉一个数后他后面的数会往前补,问删掉所......
  • 洛谷 P6146
    由于博主是只鸽子,所以咕咕咕。()不,应该是目录不在更新,请关注博客首页。有空我把目录更新一下,好久不更了传送门YouareMiserable(ATLv.15)思路Stage1这题其实是个......
  • Solution -「CSTC 2017」「洛谷 P3772」游戏
    \(\mathscr{Description}\)  有\(n\)个随机真值\(x_{1..n}\),已知\(P(x_1=1)=p_1\),对于\(2\lei\len\),\(P(x_i=1\midx_{i-1}=1)=p_i\),\(P(x_i=1\midx_{i......
  • 洛谷 P2387 [NOI2014] 魔法森林 题解【动态加点 SPFA】
    题目大意给定一个由\(n\)个点\(m\)条边的无向图,每条边有权值\((a,b)\),求一条路径使这条路径上的\((a_{\max}+b_{\max})\)最小。思路正解应该是LCT动态维护MST......
  • Solution -「SDOI 2017」「洛谷 P3706」硬币游戏
    \(\mathscr{Description}\)  Link.  给定\(n\)个长度为\(m\)且两两不同的字符串\(S_{1..n}\),字符集\(|\Sigma|=2\).各位置独立在\(\Sigma\)中均匀随机,......
  • P5730 【深基5.例10】显示屏 洛谷
    #include<stdio.h>intmain(){charstr1[30]="XXX..XXXXXXXX.XXXXXXXXXXXXXXXX";charstr2[30]="X.X..X..X..XX.XX..X....XX.XX.X";charstr3[30]="X.......
  • 网络流24题 -洛谷 P2762 太空飞行计划问题
    P2762太空飞行计划问题题意给你n个实验m个仪器(原题中n和m反了一下)第i个实验会给一个赞助费\(c[i]\)每个实验都有相应的实验仪器买第m个实验器材要\(c_2[i]\)的钱问......
  • 折半查找
    #include<map>#include<stdio.h>#include<iostream>usingnamespacestd;longlongbox[50];longlongpos[50];intmain(){longlongn,m;cin>>n>......
  • 洛谷——P1071 [NOIP2009 提高组] 潜伏者
    本次博客,我将记录洛谷P1071潜伏者[NOIP2009提高组]潜伏者理解题意:对于failed的情况,有以下三种:1.扫描完毕后发现某个字母没有对应的翻译2.扫描过程中发现自相矛盾,这......
  • *洛谷 P1018 [NOIP2000 提高组] 乘积最大(dfs+高精度)
    说在前头此篇题解是记录自己的暴力写法,并不能100分满分通过洛谷测试数据(只有60)纯纯记录写法而写https://www.luogu.com.cn/problem/P1018我还说这么简单呢这题,想太......