zoj 3008 3010

3008 Gold Coins

(刚开始以为会超时,会有数学方法,网上搜索了一下居然都是深度搜索)

分解质因数之后深度搜索

如果没有1 ≤ t ≤ n 这个条件可以直接用数学方法计算

View Code
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#define MAXN 10010
using namespace std;

long long ans,n,k;
long long a[MAXN],b[MAXN];

void DFS(long long i, long long c)
{
long long j;
if(c>n||c<=0)//百思不得其解为什么要c<=0才AC,不可能会溢出的呀!!
return;
if(i>=k)
{
ans++;
return ;
}
for(j=0;j<=b[i];j++)
{
if(j)
c*=a[i];
DFS(i+1,c);
}
}

int main()
{
long long m,i,t;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
ans=k=0;
t=n;
for(i=2;i*i<=t;i++)
if(t%i==0)
{
a[k]=i;
b[k]=1;
t/=i;
while(t%i==0)
{
b[k]++;
t/=i;
}
b[k]*=m;
k++;
}
if(t>1)
{
a[k]=t;
b[k]=m;
k++;
}
DFS(0,1);
printf("%lld\n",ans);
}
return 0;
}


3009 The Lamp Game

开始以为是位DP,结果还是深度搜索枚举所有情况(最多1024)

View Code
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#define MAXN 1050
using namespace std;

int s[MAXN],n;
double c[11],ans;

void DFS(int i, int state, double t)
{
if(t < ans)
return;
if(i==n)
{
if(state+1==(1<<n))
ans=t;
return ;
}
DFS(i+1,state,t);
DFS(i+1,state^s[i],t*c[i]);
}

int main()
{
int i,j,k,m;
while(scanf("%d%d",&n,&m),n+m)
{
ans=-1.0;
for(i=0;i<n;i++)
{
scanf("%d",&k);
for(s[i]=(1<<i);k--;)
{
scanf("%d",&j);
j--;
s[i]=s[i]|(1<<j);
}
scanf("%lf",c+i);
c[i]=(100.0-c[i])/100.0;
}
DFS(0,0,m*1.0);
if(ans>0)
printf("%.2lf\n",ans);
else
puts("-1");
}
return 0;
}



posted @ 2012-03-23 16:23    阅读(308)  评论(0编辑  收藏  举报