计蒜客初赛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;}
阅读全文
1 0
- 计蒜客初赛4练习题
- 2015初赛练习题
- 计蒜客初赛5
- 2017计蒜客初赛5
- 2017计蒜客初赛6
- 练习题4
- 腾讯编程初赛4
- 蓝桥杯初赛试题4
- 初赛复习4
- 计蒜客-2017初赛第一场
- 计蒜客初赛3练习赛
- ACM初赛试题(4)
- tinking java 4练习题
- 线性表练习题4
- C++之练习题4
- Linux练习题4
- 刘汝佳紫书练习题4-2
- linux练习题4
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—D qwb与神奇的序列
- 查找CPU占用率达到100%的原因
- Python中threading的join和setDaemon的区别及用法[例子]
- 编程第九十四天
- 将request中的所有参数存放到自定义的map中
- 计蒜客初赛4练习题
- Lambda表达式内置函数式接口
- C# 扩展方法的使用
- 最详细的windows系统安装教程,解惑一切问题
- 补题补题,stack的应用
- CentOS 7 安装 MySQL5.6
- git 版本回退
- STM32F030 ADC1的DMA采样问题
- Ubuntu Adt-Eclipse程序启动报错:The connection to adb is down, and a severe error has occured.