JZOJ 5276 神奇的玩具
来源:互联网 发布:清华 知乎 编辑:程序博客网 时间:2024/05/06 05:20
神奇的玩具
Description
有
但每种玩具只有两份,可能在相同的店里,也可能在不同的店里,同种玩具价格也可能不同,第
现在让你选择
Data Constraint
Solution
我们先从
在上述的暴力搜索上加上一些剪枝即可过掉这一题。
由于每个礼物只有两个,如果一个不选那另一个就必须选。
那么当你不选择某个玩具店的时候,也就意味着和这个玩具店拥有这同种玩具的玩具店必须选择,这是第一个剪枝。
比赛时我只加了这个剪枝,自己出数据测了一下,事实证明这个剪枝在随机数据下表现十分优良,直接就过了(数据较水)。
其次还有两个剪枝。
首先是最优性剪枝。
当你不选某些玩具店时也就确定了买下某些玩具需要的花费,若这个必要花费已经不比答案优了,那大可不用搜索下去了。
然后就是可行性剪枝。
若在当前状态下把之后的玩具店全都选了总花费仍不比答案优,那也不用搜索下去了。
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);}
阅读全文
1 0
- JZOJ 5276 神奇的玩具
- 【JZOJ 5276】 神奇的玩具
- 【JZOJ 5276】【清华集训2017模拟】神奇的玩具
- 神奇的玩具
- 【JZOJ 5270】神奇的矩阵
- 日常训练 20170628 神奇的玩具
- 【JZOJ 5271】神奇的救火现场
- 【typical】【JZOJ 5271】 神奇的救火现场
- 【JZOJ 5272】神奇的重复序列
- 【JZOJ 5272】 神奇的重复序列
- [东方宽频]玩具设计师的另类玩具
- 玩具鸭的奇遇
- 失败的玩具
- 杂记 思考的玩具
- TA最喜欢的玩具
- hadoop,高富帅的玩具?
- 劳动节的玩具。。
- 欧塞奇的玩具确实不错。
- android权限浏览
- [POJ 1195]Mobile phones
- HDU 1159 Common Subsequence 最长公共子序列
- 比较独立的ViewHolder
- 面试OR笔试6——条件数列数
- JZOJ 5276 神奇的玩具
- max 相关学习
- Laravel-任务调度
- 垃圾陷阱codevs1684
- 数据结构实验之链表五:单链表的拆分
- http://www.linuxidc.com/Linux/2015-05/117920.htm
- webpack中的loader(待学习)
- C++(4):C++命名空间
- Unity)判断敌人是否位于主角正前方一定角度方位内