D - A very hard Aoshu problem
数据范围很小呃... 暴力搜索即可...枚举等号的位置...再DFS得出左边的值..再DFS找右边有多少种方案可以等于左边的加法值...
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#define ll long long
#define oo 1000000000
#define pi acos(-1)
using namespace std;
ll ans,T[20][20],len,mid;
char s[20];
void dfs2(int i,ll data,ll pre)
{
int k;
if (i>len)
{
if (data==pre) ans++;
return ;
}
for (k=i;k<=len;k++)
dfs2(k+1,data+T[i][k],pre);
return;
}
void dfs1(int i,ll data)
{
int k;
if (i>mid) dfs2(mid+1,0,data);
for (k=i;k<=mid;k++)
dfs1(k+1,data+T[i][k]);
return;
}
int main()
{
int i,j,k;
while (gets(s+1))
{
if (s[1]=='E') break;
len=strlen(s+1);
for (i=1;i<=len;i++)
for (j=i;j<=len;j++)
{
T[i][j]=0;
for (k=i;k<=j;k++) T[i][j]=T[i][j]*10+s[k]-'0';
}
ans=0;
for (mid=1;mid<len;mid++)
dfs1(1,0);
printf("%I64d\n",ans);
}
return 0;
}
F - Aeroplane chess
看到这题就想DP嘛~~简单...每一项之和6个点有关...但是转移的方式没理清...还是队友想出来的...用E [ ] P [ ] 分别代表每个点的期望和概率...那么若A点一步能到达B点.:
E [ B ] + = 1/6* ( E [ A ] + P [ A ] )
P [ B ] + = 1/6 * P [ A ]
初始值 E [ 0 ] = 0 P [ 0 ] = 1
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#define ll long long
#define oo 1000000000
#define pi acos(-1)
using namespace std;
int n,m,next[100200];
double E[100200],P[100200];
int getnext(int k)
{
if (next[k]==k) return k;
return next[k]=getnext(next[k]);
}
int main()
{
int i,j,k,h;
while (scanf("%d%d",&n,&m)==2)
{
if (!n && !m) break;
for (i=1;i<=100100;i++) next[i]=i;
while (m--)
{
scanf("%d%d",&i,&j);
i=getnext(i);
j=getnext(j);
if (i!=j) next[i]=j;
}
for (i=1;i<=100100;i++)
{
E[i]=P[i]=0;
next[i]=getnext(i);
}
E[0]=0; P[0]=1;
for (h=0;h<n;h++)
for (i=1;i<=6;i++)
{
k=next[i+h];
if (k>n) k=n;
E[k]+=1.0/6*(E[h]+P[h]);
P[k]+=1.0/6*P[h];
}
printf("%.4lf\n",E[n]);
}
return 0;
}