标签: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 }
加油,努力,向神犇的方向前进!
标签:mem 级别 代码 har target http class lin get
原文地址:http://www.cnblogs.com/cytus/p/7782194.html