计蒜客初赛4练习题

来源:互联网 发布:slowhttptest windows 编辑:程序博客网 时间:2024/06/11 17:45

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

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


A. 商汤科技的安全令牌


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

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

1.该位置被焊上

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

3.无以上两种情况

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

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

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


#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>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进行存储。

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


#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>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;}



原创粉丝点击