计蒜客初赛4练习题
2017-06-02 19:08
85 查看
因账号冲突而遗憾错过了这场。拿来练练手,稍微了解一下题目难度吧。
比赛共两题,其中第二题有三小问,按情况,一般做出第一题和第二题的第一小问,并加快手速就能晋级了,那就看看这两部分吧
A.
思路:矩形芯片的放置,一下就想到了之前做过的一道递推,只需要将递推从一维推广到二维即可,用dp即可实现
对于被焊接了的位置,由于均为整行整列而焊接,因此,开两个数bool组记录即可,至于dp处理过程,分三种情况考虑
1.该位置被焊上
2.该位置前一个位置被焊上
3.无以上两种情况
组合一下共有9种情况,再综合一下,分类讨论即可
最后注意一下初始化,0行和1行单独处理,对于1行,别忘了也要分以上三种情况考虑。
最后,还是要细心,x,y坐标混淆的小错误真心不容易debug啊,特别是样例卡不掉的情况下
B.
思路:判断点的移动情况,有不超过半数的错误数据,于是考虑记录所有情况并计数,不少于半数的即为最终结果。
数据范围极大,开数组肯定会爆。由于数据量比较可观,于是想到map,并构造pair进行存储。
最后注意一下,判断不少于半数时用乘变除会更佳
比赛共两题,其中第二题有三小问,按情况,一般做出第一题和第二题的第一小问,并加快手速就能晋级了,那就看看这两部分吧
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; }
相关文章推荐
- 计蒜客-练习题 a+b问题
- 计蒜客-练习题 斐波那契数列
- 计蒜客-练习题 矩阵旋转
- 计蒜客-2017初赛第一场
- 阿里天池的新任务(简单)【字符串匹配哈希算法】 计蒜客初赛第一场
- 计蒜客初赛5
- 计蒜客初赛3练习赛
- 计蒜客-2017 计蒜之道 初赛 第六场-A-微软手机的信号显示
- 计蒜客-练习题 最大子阵
- 计蒜客2015 初赛题解及代码
- 2015初赛练习题
- 2015H-Star初赛题解
- Java练习题7
- C语言练习题 1
- PAT 乙级练习题1019. 数字黑洞 (20)
- 【解题报告】编程之美初赛二 扑克牌
- 计蒜客 Weather Patterns 2017icpc南宁赛区
- JAVA学习 第九天(1)练习题
- 2017.9.28 NOIP2009提高组初赛C++训练 赛后反思
- 百度之星初赛(1)1001 超级赛亚ACMer