码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷P3943星空

时间:2017-11-04 11:14:41      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:mem   级别   代码   har   target   http   class   lin   get   

  啦啦啦啦——又是五月天的歌,题目传送门歌曲传送门

  这道题比之前两道真的不是同一级别的,这里我这个蒟蒻也讲不清,不如看下这位大佬的吧,他的写的已经非常清楚了:Z-Y-Y-S,这里我就只放下我的代码,也是按照这位大佬的思路做的:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<queue>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define N 50005
 9 using namespace std;
10 typedef long long ll;
11 ll f[1<<18+1],dis[N],len[105],cost[105][105];
12 int a[N],b[N],s[N],n,m,k,cnt;queue<int>team;
13 inline int read()
14 {
15   char ch=getchar();int num=0;bool flag=false;
16   while(ch<0||ch>9){if(ch==-)flag=true;ch=getchar();}
17   while(ch>=0&&ch<=9){num=num*10+ch-0;ch=getchar();}
18   return flag?-num:num;
19 }
20 void BFS()
21 {
22   for(int i=1;i<=cnt;i++){
23     memset(dis,-1,sizeof(dis));
24     while(!team.empty())team.pop();
25     team.push(s[i]);dis[s[i]]=0;
26     while(!team.empty()){
27       int u=team.front();
28       team.pop();
29       for(int j=1;j<=m;j++){
30     for(int l=-1;l<=1;l+=2){
31       int v=u+l*len[j];
32       if(v>=1&&v<=n&&dis[v]==-1){
33         dis[v]=dis[u]+1;
34         if(b[v])cost[i][b[v]]=dis[v];
35         team.push(v);
36       }
37     }
38       }
39     }
40   }
41 }
42 void ready()
43 {
44   n=read();k=read();m=read();
45   for(int i=1;i<=k;i++)a[read()]=1;
46   n++;
47   for(int i=1;i<=n;i++)b[i]=a[i]^a[i-1];
48   for(int i=1;i<=n;i++)
49     if(b[i]){b[i]=++cnt;s[cnt]=i;}
50   for(int i=1;i<=m;i++)len[i]=read();
51   BFS();
52 }
53 void work()
54 {
55   memset(f,127/3,sizeof(f));
56   f[0]=0;
57   for(int i=0;i<=(1<<cnt)-1;i++){
58     for(int j=2;j<=cnt;j++)
59       if((i&(1<<j-1))==0){
60     for(int k=1;k<=j-1;k++)
61       if((i&(1<<k-1))==0){
62         if(cost[j][k]){
63           int v=i|(1<<j-1);
64           v|=(1<<k-1);
65           f[v]=min(f[v],f[i]+cost[j][k]);
66         }
67       }
68       }
69   }
70   printf("%lld",f[(1<<cnt)-1]);
71 }
72 int main()
73 {
74   ready();
75   work();
76   return 0;
77 }

加油,努力,向神犇的方向前进!

洛谷P3943星空

标签:mem   级别   代码   har   target   http   class   lin   get   

原文地址:http://www.cnblogs.com/cytus/p/7782194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!