作为T1,当然是越水越好啦qwq

显然经目测可得,那个所谓的质量评级根本就没用,可以直接\(W_i = W_i^{V_i}\)累积到利润里面。

这样,本问题显然是一个“子集和”问题的模板。此类问题一般使用暴力DFS或DP解决。对于本题,由于体积过大,使用DFS。(听说DP也可以解?算了出题人太懒不写了qwq)

不难发现,此题爆搜的时间复杂度为\(O(2^n)\),可以拿20分。

对于更大的数据,考虑以双向DFS的形式,降低复杂度。

DFS框架:把矿脉分为两部分,先预处理出数组\(save\),存储前一半矿脉中可能组合出的利润值,并对其进行升序排序。随后对于后一半矿脉中每一个可能达到的利润值\(k\),在\(save\)中二分查找一个数值\(res\),在\(res+k≤S\)的同时使\(res\)最大,用\(res+k\)更新答案。

搜索面对的状态:正在搜索第\(i\)个矿脉、当前利润值\(x\)、正在执行\(pos\)这一半矿脉的搜索。

剪枝:

1.优化搜索顺序

开始搜索之前,将矿脉降序排序。

2.可行性剪枝

在第二次搜索中,如果当前利润加上\(save\)数组中的最小利润大于\(S\),剪枝。

运用以上技巧,可将时间复杂度降低到\(O(2^{\frac{n}{2}}log_22^{\frac{n}{2}})\),可以AC此题。

然而此正解被某歪解疯狂卡卡成了歪解qwq

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
long long w[53], s, n, ans, save[1 << 25], t = 0;bool cmp(long long x, long long y) {return x > y;
}void find(long long x) {long long f = s - x, a = 0, b = t-1, mid;while (b - a > 1) {mid = (a+b)/2;if(save[mid] < f) {a = mid;continue;}if  (save[mid]==f) {//正好满足 ans = s;return;}b = mid-1;}if (save[a]+x <= s && save[a]+x > ans) ans = save[a]+x;if (save[b]+x <= s && save[b]+x > ans) ans = save[b]+x;//特判更新答案
}void dfs(long long i, long long x, bool pos) {//pos为0表示第一次搜索,为1表示第二次搜索 if (ans == s) return;if (x > s) return;if (!pos)if (i == n/2+1) {save[t++] = x;//保存结果 return;}if (pos)  if (i == n+1) {find(x);//二分查找 return;}dfs(i+1, x, pos);//不选 dfs(i+1, x+w[i], pos);//选
}     int main()
{scanf("%d%d", &s, &n);ans = 0;int x;for (register int i = 1; i <= n; i++) {scanf("%d%d", &w[i], &x);w[i] = pow(w[i], x);}sort(w+1, w+n+1, cmp);//优化搜索顺序 dfs(1, 0, 0);sort(save, save+t);dfs(n/2+1, 0, 1);printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/ztz11/p/9736964.html

ETO的公开赛T1《矿脉开采》题解(正解)(by Zenurik)相关推荐

  1. ETO的公开赛T1《矿脉开采》题解(另类版)

    这道题别看是签到题,写起来一点不简单 出题人的正解是双向搜索 我们把物品分成两半 每一半分别跑搜索 答案存下来,用个双指针合并即可 然后我构造了两组数据卡掉了他,不得不缩小数据范围 但我这里为什么要致 ...

  2. 2021.8.11【提高B组模拟3】T1 积木(乱糊暴搜)(正解:状压dp)

    积木 题目大意 输入样例 3 8 7 6 3 9 4 1 10 5 输出样例 18 题目数据 解题思路 暴搜就没什么好讲的了 原本以为只有40,AC了就离谱 (数据真水) 正文:状压dp 前提:我这个 ...

  3. 6轴机器人运动学(正解)

    理论部分 概念 运动学正解,简而言之,就是给出6个关节变量,求得机械臂末端的位置和姿态 即给出j1−j6j_1 - j_6j1​−j6​,求x,y,z,rx,ry,rzx,y,z,rx,ry,rzx, ...

  4. CSP 201712-4 行车路线 迪杰斯特正解

    引入 博博在做数据结构课设的时候,一开始用一个正常的dij去做这个题,也在CCF官网测试Accept,但在后来的思考中发现这个题并没有这么简单. PS:如果您是用的dij求解此题,可以试一组样例 4 ...

  5. [luogu]P4365[九省联考]秘密袭击coat(非官方正解)

    题目背景 警告:滥用本题评测者将被封号 We could have had it all. . . . . . 我们本该,拥有一切 Counting on a tree. . . . . . 何至于此 ...

  6. P1401 城市(30分,正解网络流)

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

  7. pythonsocket中tcp通信接收不到数据_TCP 为什么三次握手而不是两次握手(正解版)...

    先说结论 为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的. 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已 ...

  8. 射灯安装方法图解_家居射灯怎么选?第三代宜美SMD射灯给你正解

    前段时间,刚把自己的房子完成硬装,在灯具选择的过程中,家人的意见就不太统一.其父母觉得选灯只要够亮就行,而媳妇觉得选灯选贵的才行.到底谁的选灯方法好呢?其实家人们的建议并不是完全不对,灯够亮只是其中一 ...

  9. HDU 6625 three arrays 求两个序列异或最小值的排列(一个可以推广的正解

    目录 题意: 解析 原题描述 @(hdu 6625求两个序列异或最小值的排列) 题意: \(T(100)\)组,每组两个长度为\(n(100000)\)的排列,你可以将\(a[]\)和\(b[]\)随 ...

最新文章

  1. 整型数组负数放左面,其他放右面,要求时空复杂度:O(n), O(1)。
  2. linux 检测 iptables 是否有重复的规则
  3. DotNet_Performance_Tuning_ANTS_Performance_Profiler
  4. java remote desktop_Remote Desktop
  5. 行政编码json_基于FME国内县级及以上网络公开行政区划边界的获取
  6. Android开发之ApiCloud模块开发步骤
  7. 爱因斯坦诞辰140周年:带你走近一个真实的爱神
  8. 华为ebgp_BGP选路原则之首选值(华为特性)
  9. Html Picture
  10. Bootstrap 表格的默认样式
  11. 【Html】div 加载 html页面的方法
  12. openwrt路由器更换了Flash之后需要修改的源码
  13. java反射代码,java反射
  14. 【交通标志识别】基于matlab GUI BP神经网络交通标志识别【含Matlab源码 718期】
  15. 使用socks5将游戏的服务器连接通过本地SS服务器代理连接到加速服务器,实现游戏加速。
  16. 社区团购微信小程序开发
  17. 【网络科普】NAS和SAN - 网络附加存储和存储区域网络
  18. 报告:黑马11月就业薪资出炉!哪个学科更好就业?
  19. ORACLE获取月初、月末日期
  20. 综合应用 -- 购物车

热门文章

  1. android 代码混淆打包 log过多,Android App 混淆、打包、错误日志追踪
  2. Android支持Smart Lock 人脸解锁
  3. mysql 创建数据库 添加表
  4. js获取div元素高度和宽度的方法
  5. 单片机led灯闪烁实验总结_单片机很好玩3,花三分钟,使用普通LED小灯,制作手机“呼吸灯”...
  6. qtextedit 默认文案_QTextEdit类(老九学堂C++会员友情翻译,不喜勿喷)
  7. 老ipad搜索不到蓝牙,用手机做热点就可以了
  8. 小心,别让正则表达式规则[A-z]钻了孔子 正则表达式规则[A-z]与[A-Za-z]的差别
  9. idea注释模板设置
  10. 【关于我】【您·的·支·持·是·我·最·大·的·动·力】