计蒜客初赛4练习题

14 篇文章 0 订阅
6 篇文章 0 订阅

因账号冲突而遗憾错过了这场。拿来练练手,稍微了解一下题目难度吧。

比赛共两题,其中第二题有三小问,按情况,一般做出第一题和第二题的第一小问,并加快手速就能晋级了,那就看看这两部分吧

 

A. 商汤科技的安全令牌

 

思路:矩形芯片的放置,一下就想到了之前做过的一道递推,只需要将递推从一维推广到二维即可,用dp即可实现

对于被焊接了的位置,由于均为整行整列而焊接,因此,开两个数bool组记录即可,至于dp处理过程,分三种情况考虑

1.该位置被焊上

2.该位置前一个位置被焊上

3.无以上两种情况

组合一下共有9种情况,再综合一下,分类讨论即可

最后注意一下初始化,0行和1行单独处理,对于1行,别忘了也要分以上三种情况考虑。

最后,还是要细心,x,y坐标混淆的小错误真心不容易debug啊,特别是样例卡不掉的情况下

 

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 110;

bool r[maxn];
bool l[maxn];

int dp[maxn][maxn];

int main()
{
    int n,m,k;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        memset(r,true,sizeof(r));
        memset(l,true,sizeof(l));
        while(k--)
        {
            int c,d;
            scanf("%d%d",&d,&c);
            if(d==0)
            {
                r[c] = false;
            }
            else
            {
                l[c] = false;
            }
        }
        dp[0][0] = 0;
        dp[1][0] = 0;
        dp[0][1] = 0;
        dp[1][1] = 0;
        for(int i=2;i<=m;i++)
        {
            dp[0][i] = 0;
            if(r[1])
            {
                if((!l[i])||(!l[i-1]))
                {
                    dp[1][i] = dp[1][i-1];
                }
                else
                {
                    dp[1][i] = dp[1][i-2] + 1;
                }
            }
            else
            {
                dp[1][i] = 0;
            }
        }
        for(int i=2;i<=n;i++)
        {
            dp[i][0] = 0;
            if(l[1])
            {
                if((!r[i])||(!r[i-1]))
                {
                    dp[i][1] =dp[i-1][1];
                }
                else
                {
                    dp[i][1] = dp[i-2][1] + 1;/**/
                }
            }
            else
            {
                dp[i][1] = 0;
            }
        }
        for(int i=2;i<=n;i++)
        {
            if(!r[i])
            {
                for(int j=2;j<=m;j++)
                {
                    dp[i][j] = dp[i-1][j];
                }
            }
            else
            {
                if(!r[i-1])
                {
                    for(int j=2;j<=m;j++)
                    {
                        if(!l[j])
                        {
                            dp[i][j] = dp[i][j-1];
                        }
                        else
                        {
                            if(!l[j-1])
                            {
                                dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1];
                            }
                            else
                            {
                                dp[i][j] = dp[i][j-2] + dp[i-1][j] - dp[i-1][j-2] + 1;
                            }
                        }
                    }
                }
                else
                {
                    for(int j=2;j<=m;j++)
                    {
                        if(!l[j])
                        {
                            dp[i][j] = dp[i][j-1];
                        }
                        else
                        {
                            if(!l[j-1])
                            {
                                dp[i][j] = dp[i][j-1] + dp[i-2][j] - dp[i-2][j-1] + 1;
                            }
                            else
                            {
                                dp[i][j] = min((dp[i-2][j] + dp[i][j-1] - dp[i-2][j-1] + 1),(dp[i-1][j] + dp[i][j-2] - dp[i-1][j-2] + 1));
                            }
                        }
                    }
                }
            }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}

 

 

 

 

 

 

B. 商汤科技的行人检测(简单)

 

思路:判断点的移动情况,有不超过半数的错误数据,于是考虑记录所有情况并计数,不少于半数的即为最终结果。

数据范围极大,开数组肯定会爆。由于数据量比较可观,于是想到map,并构造pair进行存储。

最后注意一下,判断不少于半数时用乘变除会更佳

 

 

/*
Author:Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

map<pair<int,int>,int> t;

int main()
{
    int n;
    scanf("%d",&n);
    int x1,y1,x2,y2;
    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        t[(make_pair(x2-x1,y2-y1))]++;
    }
    map<pair<int,int>,int> :: iterator it;
    for(it = t.begin();it != t.end();it++)
    {
        if((it->second)*2 >= n)
        {
            printf("%d %d\n",(it->first).first,(it->first).second);
            break;
        }
    }
    return 0;
}

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值