台州学院2010年暑期程序设计兴趣班周赛(2)解题报告

周赛(2)之 解题报告 -by 0929210011

A题:简单题。
题目大意是:输入一串整数,输出ASCII对应的字母串。
直接把一连串的数字存入整型数组里,然后逐个以%c的形式输出;

 

C题:简单题.
题目大意是:给你一个字符串,由H,T组成,求出最少切割的次数,使得H平均分,T平均分;
举几个例子基本不是1次切割, 就是2次切割;猜想最多2次切割;
2条| 放在最左边,然后分别往右移动,使得2个|中夹的T为总T的一半, H为总H的一半;然后输出2条|的坐标

 

F题:DP
题目大意是:给你n条路,m百万美元,能逃离城堡的概率为P,遇到士兵的概率为Q,死路的概率为1-P-Q;如果遇到士兵需要给1百万美元,并且选择另外一条路走,如果是死路的话,选择另外一条路走。
用dp[i][j]来存储多个状态dp[i][j]表示走第i条路,付过j次钱;,(0<=i<n) (0<=j<=m)
这里要选择哪条路是最优的,从哪条路开始走;Pi越大 Qi越小 最好,所以先按照Pi/Qi从大到小排序(排序的时候注意Qi=0的情况);

dp[0][0]=1;//走第1条路(a[i]是从0开始的)的概率为1;
for(i=0;i<n;i++)
{
 for(j=0;j<=m;j++)
 {
  sum+=dp[i][j]*a[i].P;//能成功逃离的概率加到sum中;
  dp[i+1][j+1]=dp[i][j]*a[i].Q;//遇到士兵,选择另一条路找,并付一次钱;
  dp[i+1][j]+=dp[i][j]*(1-a[i].P-a[i].Q);//死路,选择另一条路走;
 }
 
}
开始由于dp[i+1][j]+=dp[i][j]*(1-a[i].P-a[i].Q);中+=和=的问题,WA了几次。

 

G题:搜索题
题目大意是:在能放黑子的地方放上一颗黑子,求出最多使白字翻变成黑子的个数;
int dfs(int x,int y)
{
 int i,j,sum=0,t=0;
 for(i=0;i<8;i++)//向8个方向搜索
 {
  
  tt.x=x+dir[i][0];
  tt.y=y+dir[i][1];
   if(legal(tt.x,tt.y)&&map[tt.x][tt.y]=='L')
   {
    t=0;
    while(legal(tt.x,tt.y)&&map[tt.x][tt.y]=='L')
    {
     t++;
     tt.x+=dir[i][0]; //向同一个方向查找白子;
     tt.y+=dir[i][1];
    }//直到找到的不是白子为止。
    if(map[tt.x][tt.y]=='D')
    {
     sum+=t;
    }//如果找到是黑子的话,说明能成功翻转部分白子;个数加到sum上去;
   }
 }
 return sum;
}
然后找出最大的sum ,就是题目要求的个数;

 

由于本人太菜BDEGIJ未做,今天的体会就是读题比做题累。


为解题报告打分
暂时不评分

★★
★★★
★★★★
★★★★★
发表您的评论(若贴AC代码或发表禁止言论等违禁行为将被删除并扣除积分)

|返回 |   | 转到页头|
Copyright @ 2008-2024(浙ICP备2022001332号), TZOJ. All Rights Reserved.