【CH2401】送礼物

乍一看,我想爆搜,但是时间复杂度O(2^n),凉凉。

所以我们考虑优化,用双向搜索解决。

将读入的数据降序排列,从中间一分两半,对前一半进行一次枚举,枚举可能的情况,用一个数组记录并去重。

再枚举后半段的情况,并对每一种情况在左半部分进行一次二分查找即可。时间复杂度为O(2n/2log22n/2)≈O(n*2n/2)。

另外,一分两半的位置有讲究,如果仅仅mid=n/2的话会造成超时,通过大量数据测试,当mid=n/2+3时速度最快

可能是这种情况时时间复杂度稍微小一些吧……

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define int long long
 6 inline int read() {
 7     int ret=0,f=1;
 8     char c=getchar();
 9     while(c<‘0‘||c>‘9‘) {if(c==‘-‘) f=-1;c=getchar();}
10     while(c<=‘9‘&&c>=‘0‘) ret=ret*10+c-‘0‘,c=getchar();
11     return ret*f;
12 }
13 using namespace std;
14 int w,n;
15 int a[50],ans,mid;
16 int x[1<<25],sum;
17 void calc(int now) {
18     int val=w-now;
19     int ret=upper_bound(x+1,x+sum+1,val)-x;
20     ret--;
21     ans=max(ans,x[ret]+now);
22 }
23 void dfs1(int now,int tot) {
24     if(now==mid) {
25         x[++sum]=tot;
26         return ;
27     }
28     dfs1(now+1,tot);
29     if(tot+a[now]<=w) dfs1(now+1,tot+a[now]);
30 }
31 void dfs2(int now,int tot) {
32     if(now==n+1) {
33         calc(tot);
34         return ;
35     }
36     dfs2(now+1,tot);
37     if(tot+a[now]<=w) dfs2(now+1,tot+a[now]);
38 }
39 bool cmp(int x,int y) {
40     return x>y;
41 }
42 signed main() {
43     w=read(); n=read();
44     for(int i=1;i<=n;i++) a[i]=read();
45     sort(a+1,a+n+1,cmp);
46     mid=n/2+3;
47     dfs1(1,0);
48     sort(x+1,x+sum+1);
49     sum=unique(x+1,x+sum+1)-(x+1);
50     dfs2(mid,0);
51     printf("%lld\n",ans);
52     return 0;
53 }

AC Code

原文地址:https://www.cnblogs.com/shl-blog/p/10583844.html

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

【CH2401】送礼物的相关文章

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. 输出格式 仅一个整数,表

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

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

仿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在他的力气范围内一次

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-

Android 仿映客直播间给主播发送礼物(实现连击效果)

效果图 类库的介绍 org.dync.giftlibrary.widget GiftAnimationUtil.java 动画类GiftControl.java 给外部调用的类(核心)GiftFrameLayout.java 礼物布局类GiftModel.java 给礼物布局填充数据类以上是礼物动画一(推荐使用礼物动画一,在demo中的Gift1Activity.java使用) LeftGiftControl.java 给外部调用的类(核心)LeftGiftsItemLayout.java 礼物