您的位置:首页 > 其它

计蒜客初赛4练习题

2017-06-02 19:08 85 查看
因账号冲突而遗憾错过了这场。拿来练练手,稍微了解一下题目难度吧。

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

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
[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: