论搜索顺序的优越性。

从小到大搜索,T到怀疑人生。

从大到小搜索,轻松AC。

双向搜索。

是这样的。我们首先排序一下,然后翻转。(当然也可以写cmp)

然后我们搜前半部分,把结果记录在某一数组中。

然后把结果排序(去重),再搜另一部分。

接下来有两种想法:

1.同样方式处理另一部分,然后双指针扫描。

2.第二次每次搜到终点,二分更新ans。

还可以加上剪枝:如果当前的和加上后面所有再加上第一部分最大值都达不到ans,剪枝。

还可以用set,但是CE了...不知道为什么。

细节顺序还可以更优,但是我不想再去烦那台可怜的评测机了.....

进步已经很明显了。

下面上代码。(最优版)

 #include <cstdio>
#include <algorithm>
const int N = ;
typedef long long LL; int n, mid, t = -;
LL a[N], b[ << ], W, ans, large, sum[N]; void DFS1(int k, LL S) {
if(S > W) {
return;
}
if(S == W) {
printf("%lld", W);
exit();
}
if(k == mid + ) {
b[++t] = S;
large = std::max(S, large);
return;
}
DFS1(k + , S);
DFS1(k + , S + a[k]);
return;
} void DFS2(int k, LL S) {
if(S > W) {
return;
}
if(S == W) {
printf("%lld", W);
exit();
}
if(large + sum[k] + S <= ans) { /// 就是这里
return;
}
if(k == n + ) {
int temp = std::upper_bound(b, b + t + , W - S) - b;
ans = std::max(ans, S + b[temp - ]);
return;
}
DFS2(k + , S + a[k]); /// 这个顺序对应上面那个剪枝。
DFS2(k + , S);
return;
} int main() {
scanf("%lld%d", &W, &n);
for(int i = ; i <= n; i++) {
scanf("%lld", &a[i]);
}
std::sort(a + , a + n + );
std::reverse(a + , a + n + );
mid = (n + ) >> ;
for(int i = n; i >= mid; i--) {
sum[i] = sum[i + ] + a[i];
}
DFS1(, );
std::sort(b, b + t + );
t = std::unique(b, b + t + ) - b - ; /// 注意reverse和unique的用法
DFS2(mid + , );
printf("%d", ans);
return ;
}

AC代码

tyvj/joyoi 1340 送礼物的更多相关文章

  1. [TYVJ2340] 送礼物 - 双向搜索

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到 ...

  2. BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列

    BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...

  3. CH2401 送礼物(双向dfs)

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  4. P1340 送礼物

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了. ...

  5. 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ

    [BZOJ4476][Jsoi2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成 ...

  6. JSOI 2015 送礼物

    [BZOJ4476] [JSOI2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都 ...

  7. [BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表)

    [BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表) 题面 给出n,k,l,r和序列a,要求从a中选一段连续的区间[i,j]出来,使得M(i,j)-m(i,j)/(j-i+k) ...

  8. TYVJ1340 送礼物

    P1340 送礼物 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后 ...

  9. 「CH2401」送礼物 解题报告

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

随机推荐

  1. 902. Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. You ...

  2. 初次启动hive,解决 ls: cannot access /home/hadoop/spark-2.2.0-bin-hadoop2.6/lib/spark-assembly-*.jar: No such file or directory问题

    >>提君博客原创  http://www.cnblogs.com/tijun/  << 刚刚安装好hive,进行第一次启动 提君博客原创 [hadoop@ltt1 bin]$ ...

  3. Day 3-5 装饰器

    开放-封闭原则: 封闭:已实现的功能代码块不应该被修改. 开放:对现有功能的扩展开放. 装饰器: 定义:在符合'开放-封闭'的原则下,给程序扩展其他的功能! 例:在不更改tokyo函数的情况下.给to ...

  4. ArrayList的扩容机制

    一.ArrayList的扩容机制 1.扩容的计算方式是向右位移,即:newSize = this.size + (this.size>>1).向右位移,只有在当前值为偶数时,才是除以2:奇 ...

  5. java学习之—排序

    package test3; public class Sort{ /** * 冒泡排序 * @param array */ public void bubbleSort(int[] array) { ...

  6. Python Argparse模块

    argparse模块 在Python中,argparse模块是标准库中用来解析命令行参数的模块,用来替代已经过时的optparse模块.argparse模块能够根据程序中的定义从sys.argv中解析 ...

  7. ContOS 常用命令

    文件与目录操作 命令 解析 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd - 返回上次所在目录 cp file1 file2 将fi ...

  8. Python中matplotlib模块解析

    用Matplotlib绘制二维图像的最简单方法是: 1.  导入模块 导入matplotlib的子模块 import matplotlib.pyplot as plt import numpy as ...

  9. Repository HDU - 2846 字典树

    题意:给出很多很多很多很多个 单词 类似搜索引擎一下 输入一个单词 判断有一个字符串包含这个单词 思路:字典树变体,把每个单词的后缀都扔字典树里面,这里要注意dd是一个单词 但是把d 和dd都放字典树 ...

  10. BZOJ2809 dispatching 【可并堆】

    题目分析: yy一下就知道了,合并用可并堆少个log. 代码: #include<bits/stdc++.h> using namespace std; ; int n,m; int b[ ...