您的位置:首页 > 其它

FZU 2165 v11(最小重复覆盖)+ codeforces 417D Cunning Gena

2014-05-01 00:49 316 查看
告诉你若干个(<=100)武器的花费以及武器能消灭的怪物编号,问消灭所有怪物(<=100)的最小花费。。。当然每个武器可以无限次使用,不然这题就太水了╮(╯▽╰)╭

这题当时比赛的时候连题都还没看就结束了。。。。赛后一看,果断是重复覆盖。。。

不过之后一直没敲。。。然后今天算是补回来吧,同时也把好久以前学的DLX复习一下。。。

DLX的话,双向十字链表。。。具体的话,百度Google什么的dancing links。。。

一开始敲的时候还是挺顺利的,因为之前做过几次重复覆盖都是直接拿精确覆盖的模板来改。。。差不多的,不过重复覆盖就删列,代码好像还少几行呢。。。不过有时调一会有时wa上一两发。。。又鉴于最近好像好多重复覆盖的题。。。就好像spfa一样频繁出现=。=个人感觉不科学。。。

而且之前那个精确覆盖的模板实在是无法直视,太挫了写得╮(╯▽╰)╭

重点来了~~~代码写好了,可是不AC╮(╯▽╰)╭太可恶了。。。。让JM帮忙看代码。。。于是苦逼地一直找bug。。。。

经过一小时吧大概的奋斗。。。JM发现。。。一个非常好笑的呵呵的亮点。。。。memset(vis,false,sizeof(false));。。。笑死我了。。。还好这是平时随便敲。。。

然后就AC了~~~

复杂度。。不知道怎么算DLX的复杂度哎~~~求高手教,或者说一般N,M多少可以~~

总结就是,打代码要仔细。。。。总之不要犯这种逗比错误。。。。真正比赛的时候就笑不出来了~~~啦啦啦~~~谢谢JM~~~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
using namespace std;

#define ll long long
//#define inf 0x3f3f3f3f
#define inf (1ll<<60)
#define maxn 110
#define mod 1000000007
#define eps 1e-8

struct node{
int x,k,st;
}p[maxn];
bool cmp(node a,node b){return a.k<b.k;}
ll dp[1<<20];
int main(){
int n,m,b,mm,tmp;
while(~scanf("%d%d%d",&n,&m,&b)){
for(int i=0;i<n;++i){
scanf("%d%d%d",&p[i].x,&p[i].k,&mm);
p[i].st=0;
while(mm--){
scanf("%d",&tmp);
p[i].st+=(1<<(tmp-1));
}
}
ll ans=inf;
sort(p,p+n,cmp);
for(int j=(1<<m)-1;j;--j)dp[j]=inf;
dp[0]=0;
for(int i=0;i<n;++i){
for(int j=(1<<m)-1;j>=0;--j)
dp[j|p[i].st] = min(dp[j|p[i].st], dp[j]+p[i].x);
ans = min(ans,dp[(1<<m)-1]+(ll)p[i].k*b);
}
if(ans==inf)puts("-1");
else printf("%I64d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: