CCF模拟题-1~5
来源:互联网 发布:java编程框架 编辑:程序博客网 时间:2024/05/18 00:56
报名第九次CCF认证,是为了能参加第二届的CCSP,做了一下题库里的C\C++模拟,发现真是够水了……
前三题,过于简单,不再赘述,发一下题目和对应答案~~~
出现次数最多的数
#include <iostream>#include <algorithm>#include <cstdio>using namespace std;const int MAXN = 1010;int S[MAXN];int main(int argc, const char * argv[]){ int n; cin >> n; for (int i = 0; i < n; i++) { scanf("%d", S + i); } sort(S, S + n); int res = S[0], times = 1, res_ = S[0], times_ = 1; for (int i = 1; i < n; i++) { if (S[i] == S[i - 1]) { times_++; } else { res_ = S[i]; times_ = 1; } if (times_ > times) { res = res_; times = times_; } } cout << res << '\n'; return 0;}
ISBN号码
#include <iostream>#include <cstdio>using namespace std;const int MAXN = 10;const int MOD = 11;int ISBN[MAXN];char X;int main(int argc, const char * argv[]){ scanf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%c", ISBN + 0, ISBN + 1, ISBN + 2, ISBN + 3, ISBN + 4, ISBN + 5, ISBN + 6, ISBN + 7, ISBN + 8, &X); int sum = 0; for (int i = 0; i < 9; i++) { sum += ISBN[i] * (i + 1); } sum %= MOD; int num = X == 'X' ? 10 : X - '0'; if (num == sum) { cout << "Right\n"; } else { cout << ISBN[0] << '-'; cout << ISBN[1] << ISBN[2] << ISBN[3] << '-'; cout << ISBN[4] << ISBN[5] << ISBN[6] << ISBN[7] << ISBN[8] << '-'; if (sum == 10) { cout << "X\n"; } else { cout << sum << '\n'; } } return 0;}
最大的矩阵
#include <iostream>#include <cstdio>using namespace std;const int MAXN = 1010;int h[MAXN];int main(int argc, const char * argv[]){ int n; cin >> n; for (int i = 0; i < n; i++) { scanf("%d", h + i); } int res = 0; for (int i = 0; i < n; i++) { int j, k; for (j = i - 1; j >= 0; j--) { if (h[j] < h[i]) { j++; break; } } if (j == -1) { j++; } for (k = i + 1; k < n; k++) { if (h[k] < h[i]) { k--; break; } } if (k == n) { k--; } int temp = (k - j + 1) * h[i]; if (temp > res) { res = temp; } } cout << res << '\n'; return 0;}
有趣的数
遇见这种问题,不用多想,百分之八九十就是dp,观察数位之间的关系,寻找状态转移方程,具体的状态转移方程看代码~~~不难理解。
#include <iostream>using namespace std;typedef long long ll;const int MAXN = 1010;const ll MOD = 1e9 + 7;const int MAXM = 6;ll dp[MAXN][MAXM];int main(){ int n; cin >> n; for (int i = 0; i < MAXM; i++) { dp[0][i]=0; } /*6种状态 * 0--剩013 * 1--剩13 * 2--剩01 * 3--剩3 * 4--剩1 * 5--无 */ for (int i = 1; i <= n; i++) { int temp = i - 1; dp[i][0] = 1; dp[i][1] = (dp[temp][0] + dp[temp][1] * 2) % MOD; dp[i][2] = (dp[temp][0] + dp[temp][2]) % MOD; dp[i][3] = (dp[temp][1] + dp[temp][3] * 2) % MOD; dp[i][4] = (dp[temp][1] + dp[temp][2] + dp[temp][4] * 2) % MOD; dp[i][5] = (dp[temp][3] + dp[temp][4] + dp[temp][5] * 2) % MOD; } cout << dp[n][5] << endl; return 0;}
I’m stuck!
这道题是常规的搜索题,思路就是dfs或者bfs,并且需要满足两个条件,而这两个条件我们可以分别先满足,然后把同时满足的计数,一般做法是先正向dfs一遍,然后把所有S能达到的方格再dfs一遍,但是这样的话时间代价太高,不知道会不会超时,比较快捷的解法就是先正向,然后反向,正向十分简单,反向比较难想一些,考到逆向思维,你需要判断是否可以原路折返回去,而这里就需要判断上一步的格子和这一步的格子之间的连通性,代码写起来比较费劲儿,需要考虑很多种情况,具体的还是看代码吧~~~
#include <iostream>#include <cstring>using namespace std;const int MAXR = 55;const int MAXC = MAXR;const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int R, C;char map[MAXR][MAXC];int visS[MAXR][MAXC];int visT[MAXR][MAXC];bool flag;void dfsS(int x, int y){ visS[x][y] = 1; switch (map[x][y]) { case '+': for (int i = 0; i < 4; i++) { if (x + dir[i][0] >= 0 && x + dir[i][0] < R && y + dir[i][1] >= 0 && y + dir[i][1] < C && map[x + dir[i][0]][y + dir[i][1]] != '#' && visS[x + dir[i][0]][y + dir[i][1]] == 0) { dfsS(x + dir[i][0], y + dir[i][1]); } } break; case '-': for (int i = 2; i < 4; i++) { if (x + dir[i][0] >= 0 && x + dir[i][0] < R && y + dir[i][1] >= 0 && y + dir[i][1] < C && map[x + dir[i][0]][y + dir[i][1]] != '#' && visS[x + dir[i][0]][y + dir[i][1]] == 0) { dfsS(x + dir[i][0], y + dir[i][1]); } } break; case '|': for (int i = 0; i < 2; i++) { if (x + dir[i][0] >= 0 && x + dir[i][0] < R && y + dir[i][1] >= 0 && y + dir[i][1] < C && map[x + dir[i][0]][y + dir[i][1]] != '#' && visS[x + dir[i][0]][y + dir[i][1]] == 0) { dfsS(x + dir[i][0], y + dir[i][1]); } } break; case '.': if (x + 1 < R && map[x + 1][y] != '#' && visS[x + 1][y] == 0) { dfsS(x + 1, y); } break; }}void dfsT(int x, int y, int preX, int preY){ if (visT[x][y] || map[x][y] == '#') { return ; } if (map[x][y] == '.' && preX == x + 1 && preY == y) { visT[x][y] = 1; } else if (map[x][y] == '-' && preX == x) { visT[x][y] = 1; } else if (map[x][y] == '|' && preY == y) { visT[x][y] = 1; } else if (map[x][y] == '+') { visT[x][y] = 1; } if (visT[x][y] == 0) { return ; } if (x - 1 >= 0) { dfsT(x - 1, y, x, y); } if (x + 1 < R) { dfsT(x + 1, y, x, y); } if (y - 1 >= 0) { dfsT(x, y - 1, x, y); } if (y + 1 < C) { dfsT(x, y + 1, x, y); }}int main(int argc, const char * argv[]){ memset(visS, 0, sizeof(visS)); memset(visT, 0, sizeof(visT)); cin >> R >> C; int xS = 0, xT = 0, yS = 0, yT = 0; for (int i = 0; i < R; i++) { scanf("%s", map[i]); for (int j = 0; j < C; j++) { if (map[i][j] == 'S') { xS = i; yS = j; map[i][j] = '+'; } else if (map[i][j] == 'T') { xT = i; yT = j; map[i][j] = '+'; } } } dfsS(xS, yS); if (visS[xT][yT] == 0) { cout << "I'm stuck!\n"; return 0; } dfsT(xT, yT, xT, yT); int counts = 0; for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (map[i][j] != 'S' && map[i][j] != 'T' && visS[i][j] && !visT[i][j]) { counts++; } } } std::cout << counts << '\n'; return 0;}
前三题就是秀智商的问题,不算笨的人30分钟内就能搞定前三题,拿到300分,第四题、第五题需要略微思考些,就算拿不全分,也不至于0分~~~
0 0
- CCF模拟题-1~5
- CCF模拟题--ISBN号码
- ccf模拟试题第一题
- ccf模拟题 有趣的数
- I'm stuck! ccf模拟题。
- 【CCF 炉石传说 模拟题】
- 有趣的数-CCF模拟题4
- CCF简单模拟题一水
- CCF权限查询(模拟)
- CCF模拟题——有趣的数详解
- CCF模拟题4-有趣的数
- CCF模拟题部分题目解题思路与AC代码
- CCF模拟题 出现次数最多的数
- CCF认证模拟题——分蛋糕
- CCF认证模拟题——学生排队
- CCF 模拟题 有趣的数 (数位DP)
- CCF软件能力认证考试模拟题 ISBN号码
- CCF 201609-1 最大波动 解题报告 简单模拟
- jquery同一按钮实现不同的动画
- bug级别定义
- 框架源码 bootstrap html5 mysql oracle sqlsever
- 多线程编程
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- CCF模拟题-1~5
- Codeforces Round #384 (Div. 2) A. Vladik and flights【思维】水题
- Android笔记:通过代码设置系统壁纸
- 使用AES加密的时候(encryptString:(NSString*)string withKey:(NSString*)key) 出现结果是nil
- codeforces #384 Vladik and fractions (构造算法)
- apk重新签名
- 把ArrayList转化为json对象
- dubbo学习笔记 一 源码编译
- 初级音乐播放器——播放存储卡上的一首音乐,能够显示歌曲名和播放进度,并且能够播放和暂停(没有SD卡会报错)