CH2401 送礼物(双向dfs)

CH2401 送礼物

描述

作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了。某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b),他一次可以搬动重量和在w(w<=2^31-1)以下的任意多个物品。GY希望一次搬掉尽量重的一些物品,请你告诉他在他的力气范围内一次性能搬动的最大重量是多少。

输入格式

第一行两个整数,分别代表W和N。
以后N行,每行一个正整数表示G[i],G[i]<= 2^31-1。

输出格式

仅一个整数,表示GY在他的力气范围内一次性能搬动的最大重量。

样例输入

20 5
7
5
4
18
1

样例输出

19

数据范围与约定

    • 对于20%的数据 N<=26
      对于40%的数据 W<=2^26
      对于100%的数据 N<=45 W<=2^31-1
  • 1. 将礼物分成两半,首先在前一半中暴力搜索出所有情况,记录,排序,去重,然后搜后一半礼物,对于后一半每一个可以达到的重量值t,都在前一半搜过的情况中二分查找W-t中数值最大的,然后更新答案,
  • 2. 优化搜索顺序,将礼物重量降序排列后再分半,搜索
  • 3. 选取适当的折半划分点,据lyd大佬所说,在N/2+2处搜索速度最快

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cctype>
 5 #include <cmath>
 6 using namespace std;
 7
 8 inline long long read()
 9 {
10     long long x(0),f(1); char ch;
11     while(!isdigit(ch=getchar())) if(ch==‘-‘) f=-1;
12     while(isdigit(ch)) x=x*10+ch-‘0‘,ch=getchar();
13     return f*x;
14 }
15 #define res register int
16 int g[50],n,half,tot;
17 unsigned int a[20000000],W,ans;
18
19 #define max(a,b) (a>b?a:b)
20
21 void dfs1(int x,unsigned int sum)
22 {
23     if(x==half) {
24         a[++tot]=sum; return ;
25     }
26     dfs1(x+1,sum);
27     if(sum+g[x]<=W) dfs1(x+1,sum+g[x]);
28 }
29
30 inline void calc(unsigned int val)
31 {
32     unsigned int rest=W-val;
33     int l=1,r=tot;
34     while(l<r)
35     {
36         int mid=(l+r+1)>>1;
37         if(a[mid]<=rest) l=mid;
38         else r=mid-1;
39     }
40     ans=max(ans,val+a[l]);
41 }
42
43 void dfs2(int x,unsigned int sum)
44 {
45     if(x==n+1) {
46         calc(sum);
47         return;
48     }
49     dfs2(x+1,sum);
50     if(sum+g[x]<=W) dfs2(x+1,sum+g[x]);
51
52 }
53
54 int main()
55 {
56 //    W=read(); n=read();
57     cin>>W>>n;
58     for(res i=1 ; i<=n ; i++) scanf("%d",&g[i]);//g[i]=read();
59     sort(g+1,g+n+1);
60     reverse(g+1,g+n+1);
61     half=n/2+3;
62     dfs1(1,0);
63     sort(a+1,a+tot+1);
64     tot=unique(a+1,a+tot+1)-a-1;
65     dfs2(half,0);
66     printf("%lld\n",ans);
67     return 0;
68 }

原文地址:https://www.cnblogs.com/wmq12138/p/10386678.html

时间: 2024-10-10 11:45:36

CH2401 送礼物(双向dfs)的相关文章

微信里投票送礼物充值活动怎么做的什么系统?

你是不是最近总被人让我帮着他们亲戚家的孩子投票,说是幼儿园举办的活动,让我帮着投投票.要说麻烦吧,也不麻烦,就是总在想这有什么用呢?那些孩子我一个都不认识,说白了只是帮他们投票的其中一个水军而已. 今天我姐的孩子参加幼儿园投票活动,让给拉拉票,自己投完了还要去群里发一圈好友发一遍,票数不够还要心甘情愿的买礼物,关键是下面买礼物的人还显示,不买还不行,当时心想这个一个孩子刷200元的礼物,50个孩子最起码也要上万啊,这生意绝了! 我小侄女的幼儿园人多,200个小盆友左右,平时她在班级表现的比较积成

wikioi 1043 双向dfs

思路:这题棋盘DP或者搜索,或者暴力都可以,因为棋盘比较小. 这里用的双向dfs. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #includ

仿QQ空间送礼物功能

本文链接:http://www.cnblogs.com/dengxinglin/archive/2013/03/23/2976737.html 我们在QQ空间里面有一个送礼物的功能,显示了最近过生日的人.我们只要把鼠标放到如下图的生日快乐那标签上,就会显示可以给该人送的礼物!! 单击其中的一个礼物,就会马上送出去.但是我们现在是要说的还有单击更多的时候,会另外弹出一个新的窗口在当前页面最前面!如下图显示: 怎么实现那上面的功能呢? 就是把鼠标放上去,弹出一天tips,单击tips里面的控件,之后

送礼物给女朋友浪漫

看到网上许多兄弟为送女朋友什么礼物而烦恼,尤其是一些整天和计算机打交道的弟兄们,和机器打交道时间长了,都那个...了,看着真让我这个整天面对机器的前辈着急呀,想起当年俺好想有高人指点的感觉,就觉得应该做件造福弟兄们的事,不能让外行人把我们做计算机的看那个了!下面这篇短文就是兄弟我的研究成果哟!)时代在发展,一人眼光有限,希望兄弟们继续补充和修正,打造出我们自己的宝典来哦. 要给女朋友送礼,先得了解女人的需求.而没结婚的女人和结了婚的女人需求在程度上会有区别,倾向性会不同,但女人的本质是不会变的.

TYVJ1340 送礼物

P1340 送礼物 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是 GY的力气也异常的大(-_-b),他一次可以搬动重量和在w(w<=2^31-1)以下的任意多个物品.GY希望一次搬掉尽量重的一些物品,请你 告诉他在他的力气范围内一次性能搬动的最大重量是多少. 输入格式 第一行两个整数,分别代表W和N.以后N行

upc7834 送礼物

题目描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b),他一次可以搬动重量和在w(w<=2^31-1)以下的任意多个物品.GY希望一次搬掉尽量重的一些物品,请你告诉他在他的力气范围内一次性能搬动的最大重量是多少. 输入 第一行两个整数,分别代表W和N.以后N行,每行一个正整数表示G[i],G[i]<= 2^31-1. 输出 仅一个整数,表示GY在他的力气范围内一次

【CH2401】送礼物

乍一看,我想爆搜,但是时间复杂度O(2^n),凉凉. 所以我们考虑优化,用双向搜索解决. 将读入的数据降序排列,从中间一分两半,对前一半进行一次枚举,枚举可能的情况,用一个数组记录并去重. 再枚举后半段的情况,并对每一种情况在左半部分进行一次二分查找即可.时间复杂度为O(2n/2log22n/2)≍O(n*2n/2). 另外,一分两半的位置有讲究,如果仅仅mid=n/2的话会造成超时,通过大量数据测试,当mid=n/2+3时速度最快 可能是这种情况时时间复杂度稍微小一些吧…… 1 #includ

html5游戏开发-零基础开发《圣诞老人送礼物》小游戏

开言: 以前lufy前辈写过叫" HTML5游戏开发-零基础开发RPG游戏"的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识.今天我也以零基础为视点,为大家讲述如何开发一款简单的游戏.希望大家看了这篇文章,能使你对理解游戏开发有帮助. 你可以先测试一下游戏: http://lufylegend.com/lufylegend_developers/yorhom_Christmas/index.html 1,如何进行游戏开发 1.1游

送礼物(二分答案+单调队列)

QUESTION: JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感.于是,JYY决定从中挑选连续的一些礼物,但究竟选 哪些呢?假设礼品店一共有\(N\)件礼物排成一列,每件礼物都有它的美观度.排在第\(i\)(\(1\leq i \leq N\))个位置的礼物美观度为正整数\(A_i\).JYY决定选出其中连续的一段,即编号为礼物\(i\),\(i+1\),....,\(j-