SRM 513 div2

两个号终于都蓝了……接下来坐等回绿= =|||

250pt:

水题,不解释,三重循环判断即可

vector <string> ans;
string ret;

class TrainingCamp
{
        public:
        vector<string> determineSolvers(vector<string> attendance, vector<string> problemTopics)
        {
            int i,j,n,m,d,k;
            n=attendance.size();
            m=problemTopics.size();
            d=attendance[0].size();
            for (i=0;i<n;i++)
            {
                ret="";
                for (j=0;j<m;j++)
                {
                    for (k=0;k<d;k++)
                    {
                        if (attendance[i][k]=='-' && problemTopics[j][k]=='X') break;
                    }
                    if (k<d) ret+='-';
                    else ret+='X';
                }
                ans.push_back(ret);
            }
            return ans;
        }
};

500pt

没有分析复杂度,考虑只有50个小球,所以分别求出板在相邻两个小球之间有多少种取法,最后将答案一乘即可,这个不太好数,所以写完分数不高,后来看到坐标范围不大,应该可以直接枚举每个位置,这样就好写多了

bool cmp(int x,int y)
{
    return x<y;
}

#define MOD 1000000009

class YetAnotherIncredibleMachine
{
        public:
        long long countWays(vector<int> platformMount,vector<int> platformLength,vector<int> balls)
        {
            long long i,ans,j,n,l,ret,m;
            n=platformLength.size();
            m=balls.size();
            ans=1;
            sort(balls.begin(),balls.end(),cmp);
            for (i=0;i<n;i++)
            {
                ret=0;
                l=platformMount[i]-platformLength[i];
                for (j=0;j<m;j++)
                {
                    if (balls[j]<l) ;
                    else if (balls[j]==l) l++;
                    else
                    {
                        int r=min(balls[j]-1,platformLength[i]+platformMount[i]);
                        if (r-l-platformLength[i]+1>0) ret=(ret+r-l-platformLength[i]+1)%MOD;
                     //   printf("%d..%d..%d..%d~\n",l,r,ret,r-l-platformLength[i]+1);
                        l=balls[j]+1;
                    }
                }
                if (platformMount[i]-l+1>0) ret=(ret+platformMount[i]-l+1)%MOD;
             //   printf("%d..\n",ret);
                ans=(ret*ans)%MOD;
            }
            return ans;
        }
};

1000pt

第二题写挫了,没时间开第三题了,不然第三题还是很简单的,4*4的范围,瞎搞都没事……直接记忆化搜索吧。

int Change(int x1,int y1,int x2,int y2,vector<string> board)
{
    int ans=0,i;
    if (x2-x1==1)
    {
        for (i=y1;i<y2;i++)
        {
            ans=ans*10+board[x1][i]-'0';
        }
        return ans;
    }
    if (y2-y1==1)
    {
        for (i=x1;i<x2;i++)
        {
            ans=ans*10+board[i][y1]-'0';
        }
        return ans;
    }
}

int dp[5][5][5][5];

int DFS(int x1,int y1,int x2,int y2,vector<string> board)
{
    int i;
    if (dp[x1][y1][x2][y2]!=-1) return dp[x1][y1][x2][y2];
    if (x2-x1==1)
    {
        dp[x1][y1][x2][y2]=Change(x1,y1,x2,y2,board);
    }
    else if (y2-y1==1)
    {
        dp[x1][y1][x2][y2]=Change(x1,y1,x2,y2,board);
    }
    else
    {
        for (i=x1+1;i<x2;i++)
        {
            dp[x1][y1][x2][y2]=max(dp[x1][y1][x2][y2],DFS(x1,y1,i,y2,board)+DFS(i,y1,x2,y2,board));
        }
        for (i=y1+1;i<y2;i++)
        {
            dp[x1][y1][x2][y2]=max(dp[x1][y1][x2][y2],DFS(x1,y1,x2,i,board)+DFS(x1,i,x2,y2,board));
        }
    }
    return dp[x1][y1][x2][y2];
}

class CutTheNumbers
{
        public:
        int maximumSum(vector<string> board)
        {
            int i,j,n,m;
            n=board.size();
            m=board[0].size();
            memset(dp,-1,sizeof(dp));
            return DFS(0,0,n,m,board);
        }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值