您的位置:首页 > 其它

The 37th ACM/ICPC Asia Regional JinHua Site Online Contest - D,F

2012-09-22 19:32 459 查看
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
);
     }
     return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐