作为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);
}

ETO的公开赛T1《矿脉开采》题解(正解)(by Zenurik)的更多相关文章

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

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

  2. NOIp2016 D2T3 愤怒的小鸟【搜索】(网上题解正解是状压)

    题目传送门 没啥别的想法,感觉就是搜索,经过原点的抛物线已知两个点就可以求出解析式,在还没有被打下来的两个猪之间随意配对,确定解析式之后标记在这个抛物线下被打下来的猪. 猪也可以单独用一个抛物线打下来 ...

  3. Bzoj 1537: [POI2005]Aut- The Bus 题解 [由暴力到正解]

    1537: [POI2005]Aut- The Bus Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 264[Submit][S ...

  4. DATASNAP远程方法返回TSTREAM正解(转咏南兄)

    DATASNAP远程方法返回TSTREAM正解 DATASNAP远程方法返回TSTREAM,如果数据大小超过32K是会报错的.许多DELPHIER栽在这个上头,甚至开始怀疑TSTREAM返回数据的可行 ...

  5. DATASNAP远程方法返回TSTREAM正解

    DATASNAP远程方法返回TSTREAM正解 DATASNAP远程方法返回TSTREAM,如果数据大小超过32K是会报错的.许多DELPHIER栽在这个上头,甚至开始怀疑TSTREAM返回数据的可行 ...

  6. BZOJ3110 K大数查询 【线段树 + 整体二分 或 树套树(非正解)】

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  7. 【百度之星2014~复赛 解题报告~正解】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

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

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

  9. HDU 4691 正解后缀数组(暴力也能过)

    本来是个后缀数组,考察算法的中级题目,暴力居然也可以水过,就看你跳不跳坑了(c++和G++返回结果就很不一样,关键看编译器) 丝毫不差的代码,就看运气如何了.唯一差别c++还是G++,但正解是后缀数组 ...

随机推荐

  1. 实用的随机数生成类Random:测试(随机产生100个不重复的正整数)

    实用的随机数生成类Random:测试(使用Random类随机生成100个不重复的正整数) 一.之前我们使用随机数用的是Math类的random()方法: tips: 产生随机数(0~9中任意整数)的方 ...

  2. .NET开源工作流RoadFlow-表单设计-日期时间选择

    在表单中添加一个日期时间选择框: 选择范围:指定一个日期选择范围. 时间:是否允许选择时间.

  3. Catia 二次开发资料(转)

    Catia 二次开发 CATIA V5在开发之初就遵循面向对象的设计思想(OO),构建了完全基于组件的体系结构(PPR: Products,Process,Resource),有效地解决了维护.管理. ...

  4. 国家与大洲对应关系json数据

    [ { "continent_cname": "欧洲", "continent_name": "EU", "c ...

  5. SQLServer存储过程 实例,很多语法可以以后参考

    SQL代码 alter PROCEDURE sp_addnewdtgtype ( ), @dtgdllcontent image, ) ) AS BEGIN ); declare @v_count i ...

  6. Spyder更改默认工作路径已经文件路径

    打开spyder,选择菜单栏中的Tools--->Preferences--->Current working directory   然后选择最下面的单选按钮The following ...

  7. oracle-2_dblink的创建和使用

    一.创建dblink 1.查询创建dblink表 SELECT * FROM DBA_DB_LINKS; ); BEGIN SELECT COUNT(*) INTO I FROM DBA_DB_LIN ...

  8. 3.GlusterFS 企业分布式存储的搭建

    3.1 硬件要求 一般选择 2U 机型,磁盘 SATA 盘 4TB,如果 IO 要求比较高,可以采购 SSD 固态硬盘.为了充分保证系统的稳定性和性能,要求所有 glusterfs 服务器硬件配置尽量 ...

  9. March 15 2017 Week 11 Wednesday

    The starting point of all achievements is desire. 成功的第一步是渴望. Only you desire for somethings, you can ...

  10. python入门23 pymssql模块(python连接sql server增删改数据 )

    增删改数据必须connect.commit()才会生效 回滚函数 connect.rollback() 连接数据库 ''' dinghanhua sql server增删改 ''' import py ...