讨论 / PID258 war敌军情报 只有90分 请高手指点错误
drcool 2014-01-05 08:11:12
点我顶贴 收藏 删除
思想就是dfs,当能杀时,枚举每一个能杀对象,并继续dfs,第三个点错误,答案是4,我算出来是5

#include <stdio.h>

#include <string.h>

int A,G,u0,n0;

int n;

char du[11],hu[11];

int X[100000][2];

int ans;

void dfs(int from, int xx,int nx,int ux,char *dx)

{

int i,j;

char dn[11];

if(ux==0)

{

if(ans>n0-nx) ans=n0-nx;

return;

}

memcpy(dn,dx,11);

for(i=from;i<n;i++)

{

xx+=nx*G;

if(xx>=A) break;

if(du[ X[i][0] ]||dn[ X[i][1] ]) continue;

dn[X[i][1]]=1;

nx--;

if(n0-nx>=ans) return;

}

if(xx>=A)

{

for(j=1;j<=u0;j++)

{

if((!du[j])&&hu[j])

{

if(j==X[i][0])

{

du[j]=1;

dfs(i+1,0,nx,ux-1,dn);

du[j]=0;

}

else

{

if(!dn[ X[i][1] ])

{

du[j]=1;

dn[X[i][1]]=1;

dfs(i+1,0,nx-1,ux-1,dn);

dn[X[i][1]]=0;

du[j]=0;

}

else

{

du[j]=1;

dfs(i+1,0,nx,ux-1,dn);

du[j]=0;

}

}

}

}

}

else

{

if(ans>n0-nx) ans=n0-nx;

}

}

int main()

{

int i;

char dn[11];

memset(dn,0,sizeof(dn));

scanf("%d%d%d%d",&A,&G,&u0,&n0);

scanf("%d",&n);

for(i=0;i<n;i++)

{

scanf("%d%d",&X[i][0],&X[i][1]);

hu[X[i][0]]=1;

}

if(G*n0>=A) {printf("0"); return 0;}

ans=n0;

dfs(0,0,n0,u0,dn);

printf("%d",ans);

return 0;

}

查看更多回复
提交回复