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

56 篇文章 0 订阅
24 篇文章 0 订阅

     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;
}


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值