题解 CF6D CF6D Lizards and Basements 2

Posted cbyyc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 CF6D CF6D Lizards and Basements 2相关的知识,希望对你有一定的参考价值。

$dfs$ 好啊

题意

有一队人,你可以用火球点某个人,会对当前人造成a点伤害,对旁边的人造成b点伤害。

不能打1号和n号,求最少多少发点死所有人。

Note 

一个人被打死当且仅当它的血量 <0。

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<algorithm>
 7 #include<string>
 8 #define ll long long
 9 #define maxn 100005
10 #define inf 2147483647
11 #define mod 10003
12 #define eps 1e-6
13 #define pi acos(-1.0)
14 #define de(x) ((x)*(x))
15 using namespace std; 
16 inline int read()
17 int x=0,f=1; char ch=getchar();
18 while(!isdigit(ch)) if(ch==-)f=-1;ch=getchar();
19 while(isdigit(ch)) x=x*10+ch-48;ch=getchar();
20 return x*f;
21 
22 int n,a,b,h[15],tot,ans;
23 int p[155],val[155];
24 inline void check()
25 int yu=max(h[n-1]/a+(h[n-1]>=0),h[n]/b+(h[n]>=0));
26 for(int i=1;i<=yu;i++) p[++tot]=n-1;
27 if(ans>tot)
28 for(int i=1;i<=tot;i++) val[i]=p[i];
29 ans=tot;
30 
31 tot-=yu;
32 
33 inline void dfs(int now)//标准的dfs
34 if(now>n-1) check();return;
35 if(h[now-1]<0) dfs(now+1);
36 int last=tot,A=h[now-1],B=h[now],C=h[now+1];
37 while(1)
38 h[now]-=a; h[now-1]-=b;
39 h[now+1]-=b; p[++tot]=now;
40 if(h[now-1]<0) dfs(now+1);
41 if((h[now-1]<0&&h[now]<0)||tot>=ans)
42 tot=last;
43 h[now-1]=A; h[now]=B; h[now+1]=C;
44 break;
45 
46 
47 
48 signed main()
49 n=read(); a=read(); b=read();
50 for(int i=1;i<=n;i++) h[i]=read();
51 ans=inf; tot=0;
52 dfs(2);
53 printf("%d\n",ans);
54 for(int i=1;i<=ans;i++) printf("%d ",val[i]);
55 return 0;
56 
yyy

 

以上是关于题解 CF6D CF6D Lizards and Basements 2的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2732 Leapin' Lizards (最大流)

HDU2732:Leapin' Lizards(最大流)

HDU 2732 Leapin&#39; Lizards(拆点+最大流)

HDU 2732 Leapin&#39; Lizards(拆点+最大流)

HDU - 2732 -Leapin' Lizards

HDU2732Leapin&#39; Lizards(最大流SAP,建图---折点法)