JZOJ 5276 神奇的玩具
神奇的玩具
Description
有 n n种玩具,一共有mm个点买这些玩具。
但每种玩具只有两份,可能在相同的店里,也可能在不同的店里,同种玩具价格也可能不同,第 i i种玩具的两个价格分别是qiq_i和 pi p_i。
现在让你选择 k k个玩具店,你只能买这kk个玩具店里的玩具,你必须把每种玩具都买一个,求最小花费。
Data Constraint
Solution
我们先从 50 50%的数据入手。
50 50%很容易只需用 O O(2m2^m)的时间复杂度不加任何剪枝就能砍下。
在上述的暴力搜索上加上一些剪枝即可过掉这一题。
由于每个礼物只有两个,如果一个不选那另一个就必须选。
那么当你不选择某个玩具店的时候,也就意味着和这个玩具店拥有这同种玩具的玩具店必须选择,这是第一个剪枝。
比赛时我只加了这个剪枝,自己出数据测了一下,事实证明这个剪枝在随机数据下表现十分优良,直接就过了(数据较水)。
其次还有两个剪枝。
首先是最优性剪枝。
当你不选某些玩具店时也就确定了买下某些玩具需要的花费,若这个必要花费已经不比答案优了,那大可不用搜索下去了。
然后就是可行性剪枝。
若在当前状态下把之后的玩具店全都选了总花费仍不比答案优,那也不用搜索下去了。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>#define fo(i,j,l) for(i=j;i<=l;i++)
#define fd(i,j,l) for(i=j;i>=l;i--)using namespace std;
typedef long long ll;
const ll maxn=1e9;
const ll M=50,N=110;
ll other[M][N],cost[M][N],shop[M][N],g[M],ok[M][N],hy[M][N];
ll past[M],jz[N];
int la[N],ne[N];
int n,m,j,k,l,i,o,a,b,c,d;
ll ans=maxn;
bool bz;ll min(ll a,ll b)
{if(a<b)return a;else return b;}void dg(int o,int sy,ll least)
{int i;if((!sy)||(o==m+1)){ll kk=0;fo(i,1,n)if(jz[i]==maxn)return; else kk+=jz[i];if(kk<ans)ans=kk;return;}bz=true;ll oo=least;fo(i,1,g[o])if((ok[o][i]==1)&&(jz[shop[o][i]]==maxn)){bz=false; break;}else oo=oo+other[o][i]*(ok[o][i]==0);if((bz)&&(oo<ans))dg(ne[o],sy,oo);fo(i,1,g[o])if(!ok[o][i])oo=oo+other[o][i];fo(i,1,g[o]){hy[o][i]=jz[shop[o][i]];if(cost[o][i]<jz[shop[o][i]])jz[shop[o][i]]=cost[o][i];}dg(ne[o],sy-1,least);fd(i,g[o],1)jz[shop[o][i]]=hy[o][i];
}int main()
{cin>>n>>m>>k;
fo(i,1,n){ scanf("%d%d%d%d",&a,&b,&c,&d);
shop[a][++g[a]]=i; cost[a][g[a]]=b; other[a][g[a]]=d;
shop[c][++g[c]]=i; cost[c][g[c]]=d; other[c][g[c]]=b;
if(a>c)ok[a][g[a]]=1;else
if(a<c)ok[c][g[c]]=1;else { if(!past[a])k--;
past[a]=1;
}
}
fo(i,1,n)jz[i]=maxn;
fo(i,1,m)ne[i]=i+1,la[i]=i-1;
ne[0]=1; la[m+1]=m;
fo(i,1,m)
if(past[i]){ fo(l,1,g[i])
jz[shop[i][l]]=min(jz[shop[i][l]],cost[i][l]);
ne[la[i]]=ne[i]; la[ne[i]]=la[i];
}else if(!g[i]) ne[la[i]]=ne[i],la[ne[i]]=la[i];
if(k>0){ dg(ne[0],k,0);
if(ans==maxn)ans=-1;
}
else { ans=0;
fo(i,1,n)
if(jz[i]!=maxn)ans+=jz[i];
else { ans=-1; break;
}
if(k<0)ans=-1;
}
printf("%lld",ans);
}
JZOJ 5276 神奇的玩具相关推荐
- 机器人日行十万步却无需动力源!究竟如何完美的机械结构让你开始怀疑人身...
来源:机器人大讲堂 摘要:上图这个机器人可不简单,它是世界纪录的保持者,目前最新的纪录是连续步行27小时,总长72公里(相当于十万步还要多).而最最关键的是,它完全凭借自己完美的机械结构,没有任何动力 ...
- 与殿堂级大师隔空对话——一张纸是怎么限制了我们的想象力
▲ 点击查看 七天假期,熊孩子在家捣乱的情况实在是太多啦,就一眨眼的功夫,满地的积木,到处都有,还有到处都是的纸张碎片,真真是十分的头疼! 在蚊子小时候,玩具远不如现在丰富,一张纸都可以让蚊子玩个 ...
- 以太坊五岁了,它现在还好吗?
作者:Consensys 翻译:Quiana 据说,重大突破通常遵循以下七个步骤: 1.首先,没人听说过. 2.他们听说过你,但认为你疯了. 3.然后他们开始了解你的产品,但认为它没有机会. 4.然后 ...
- 创业陷阱——逐一点评301个骗你没商量的项目
创业陷阱--逐一点评301个骗你没商量的项目 1.灵芝栽培:技术是真的.但是,骗子把收购价格提高了成千上万倍,说什么种植2平方米,年收十几万.还搞个什么回收合同,其实都是幌子. 2.冬虫夏草:技术还不 ...
- 【01月18日】【精彩电影合集】【10部】【亲测】【Lsyq5647发布】
今日电影更新[10部] 1.<赎命24小时>07布鲁斯南火爆大片DVD完美中英双字 2.<贝奥武夫>07最新幻想冒险大片R5-R中字 3.<四月三周两天>07最新戛 ...
- 探索隐藏在冰山下的自己
学习心理学已经两年了,学习的越深入越发现心理学的奇妙之处,在学习的时候.老师往往能通过一个动作一句话就能发现一个人未显露的一面,也能帮助更多的人走出内心的困境,敞开心扉迎接广阔的天地.这让我羡慕不已. ...
- 4部C4D动画短片视觉、叙事完美融合
本期文章为你带来4部动画短片,都用到C4D制作 4部短片风格迥异 - 或可爱.或艺术.或东方...但不论画面,还是叙事都十分打动人心 4部动画短片的创作者分享了自己的制作过程.故事灵感以及更多关于创作 ...
- 人物-发明家-贝尔:亚历山大·贝尔
ylbtech-人物-发明家-贝尔:亚历山大·贝尔 亚历山大·格拉汉姆·贝尔(Alexander Graham Bell,1847年3月3日-1922年8月2日),美国发明家.企业家. 他获得了世界上 ...
- 【02月26日】【精彩电影合集】【10部】【亲测】【Lsyq5647发布】
1.<加百利>07最新火爆动作科幻片DVD中字 片名:加百利 导演:Shane Abbess 主演:Andy WhitfieldDwaine StevensonSamantha Noble ...
最新文章
- java基础国庆作业_java程序设计国庆作业
- Mysql数据库基础系列(二):表结构、键值
- Linux下常用的压缩与解压命令
- zcmu1156: 新年彩灯Ⅰ
- Android高效加载大图、多图解决方案_LruCache,有效避免程序OOM
- 提升Azure App Service的几个建议
- php访问js文件不存在,php文件里js不能被执行
- memcache 防火墙策略
- 什么是 Python 自省?
- ssh整合步骤之一(搭建环境)
- Redis 缓存过期(maxmemory) 配置/算法 详解
- 50Hz工频干扰消除
- 1、position用法技巧,2、CSS 属性 选择器,3、CSS 选择器
- JAVA对象转Json对象
- C# For Koyo PLC Serial Port Communication Library,C# 与光洋PLC通讯库,光洋PLC通讯,PLC通讯,光洋
- 《我想吃掉你的胰脏》观后感
- 交换机端口mtu值最大_中低端交换机修改三层接口MTU值的说明
- CF18B/01背包
- STM32-增量式旋转编码器测量
- 看了就会的浏览器帧原理