ETO的公开赛T1《矿脉开采》题解(正解)(by Zenurik)
作为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)的更多相关文章
- ETO的公开赛T1《矿脉开采》题解(另类版)
这道题别看是签到题,写起来一点不简单 出题人的正解是双向搜索 我们把物品分成两半 每一半分别跑搜索 答案存下来,用个双指针合并即可 然后我构造了两组数据卡掉了他,不得不缩小数据范围 但我这里为什么要致 ...
- NOIp2016 D2T3 愤怒的小鸟【搜索】(网上题解正解是状压)
题目传送门 没啥别的想法,感觉就是搜索,经过原点的抛物线已知两个点就可以求出解析式,在还没有被打下来的两个猪之间随意配对,确定解析式之后标记在这个抛物线下被打下来的猪. 猪也可以单独用一个抛物线打下来 ...
- Bzoj 1537: [POI2005]Aut- The Bus 题解 [由暴力到正解]
1537: [POI2005]Aut- The Bus Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 264[Submit][S ...
- DATASNAP远程方法返回TSTREAM正解(转咏南兄)
DATASNAP远程方法返回TSTREAM正解 DATASNAP远程方法返回TSTREAM,如果数据大小超过32K是会报错的.许多DELPHIER栽在这个上头,甚至开始怀疑TSTREAM返回数据的可行 ...
- DATASNAP远程方法返回TSTREAM正解
DATASNAP远程方法返回TSTREAM正解 DATASNAP远程方法返回TSTREAM,如果数据大小超过32K是会报错的.许多DELPHIER栽在这个上头,甚至开始怀疑TSTREAM返回数据的可行 ...
- BZOJ3110 K大数查询 【线段树 + 整体二分 或 树套树(非正解)】
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 【百度之星2014~复赛 解题报告~正解】The Query on the Tree
声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...
- [luogu]P4365[九省联考]秘密袭击coat(非官方正解)
题目背景 警告:滥用本题评测者将被封号 We could have had it all. . . . . . 我们本该,拥有一切 Counting on a tree. . . . . . 何至于此 ...
- HDU 4691 正解后缀数组(暴力也能过)
本来是个后缀数组,考察算法的中级题目,暴力居然也可以水过,就看你跳不跳坑了(c++和G++返回结果就很不一样,关键看编译器) 丝毫不差的代码,就看运气如何了.唯一差别c++还是G++,但正解是后缀数组 ...
随机推荐
- 【学习笔记】开源日志记录工具log4j使用方法
http://blog.csdn.net/zouqingfang/article/details/37558469 一.在MyEclipse中使用log4j的步骤比较简单,主要分为以下四个步骤: 1. ...
- jQuery plugin: Tablesorter 2.0
http://mottie.github.io/tablesorter/docs/example-pager.htmlhttp://tablesorter.com/docs/example-pager ...
- Python爬虫《爬取get请求的页面数据》
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- (转)Android新的menu实现——ActionMode
Android的menu有多种实现方式,以前写过一篇Android中五种常用的menu(菜单),这里介绍一种新的menu实现方式:ActionMode.ActionMode是Android 3.0以后 ...
- 如何保护好我们的比特币(bitcoin)
转自:http://8btc.com/thread-819-1-1.html 随着比特币(BTC)的使用者越来越多:价格也很高(2013年,1比特币价格长期在100美元以上):同时比特币没有一个中央机 ...
- input type=number去掉上下箭头
<input type="number" ...> <style> input::-webkit-outer-spin-button, input::-we ...
- postgres循环sql
CREATE OR replace function loop_addDevice(i integer) RETURNS integer as $$ declare count alias ; all ...
- Shell脚本学习之expect命令
转载:http://blog.csdn.net/leexide/article/details/17485451 目录(?)[-] 一概述 二expect的安装 一Tcl 安装 二expect 安装 ...
- 2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest
2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest A. Fried Fish 题意:有N条鱼,有一个同时可 ...
- jackson简单实用
---------------------------------------------------------------------------------------------------- ...