1. 接水问题
来源:NOIP2010普及组 https://ac.nowcoder.com/acm/contest/238/C
算法:模拟
复杂度:
解题思路:
从前往后依次考虑队列中的每个同学,每个同学会去当前结束时间最早的水龙头处接水。
由于本题数据范围较小,因此可以直接循环一遍所有水龙头,求出当前结束时间最早的水龙头编号。那么我们就将当前同学安排在这个水龙头的位置上,然后将该水龙头的结束时间加上当前同学的接水时间。
最后,所有水龙头结束时间的最大值就是答案。
C++ 代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 10010, M = 110; int n, m; int w[N]; int q[M]; int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%d", &w[i]); for (int i = 0; i < n; i++) { int t = 0; for (int j = 0; j < m; j++) if (q[j] < q[t]) t = j; q[t] += w[i]; } int res = 0; for (int i = 0; i < m; i++) res = max(res, q[i]); cout << res << endl; return 0; }
2. 寻宝
来源:NOIP2012普及组 https://ac.nowcoder.com/acm/contest/240/C
算法知识点: 枚举,模拟
复杂度:
解题思路:
模拟从第 层走到第 层的整个过程,每次找出从当前房间开始第 个有梯子的房间即可。
最终每层遇到的 之和就是答案,不要忘记将答案对 取模。
C++ 代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 10010, M = 110, mod = 20123; int n, m, k; bool st[N][M]; int x[N][M]; int main() { scanf("%d%d", &n, &m); int res = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) scanf("%d%d", &st[i][j], &x[i][j]); scanf("%d", &k); for (int i = 0; i < n; i++) { int s = 0; for (int j = 0; j < m; j++) s += st[i][j]; int t = x[i][k]; res = (res + t) % mod; t %= s; if (!t) t = s; for (int j = k;; j = (j + 1) % m) { if (st[i][j]) { if (--t == 0) { k = j; break; } } } } printf("%d\n", res); return 0; }
3. 买铅笔
来源:NOIP2016普及组 https://ac.nowcoder.com/acm/contest/244/D
算法知识点: 模拟,枚举
复杂度:
解题思路:
由于老师只能买一种包装的铅笔,因此直接枚举买哪种包装,然后求出最少需要买多少包,才能使总数量不少于 即可。其中 是老师需要买的铅笔总数。
C++ 代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main() { int n; scanf("%d", &n); int res = 1e9; for (int i = 0; i < 3; i++) { int s, p; scanf("%d%d", &s, &p); res = min(res, (n + s - 1) / s *p); } printf("%d\n", res); return 0; }
4. 标题统计
来源:NOIP2018普及组 https://ac.nowcoder.com/acm/contest/293/A
算法知识点: 字符串处理
复杂度:
解题思路:
当用cin
读入char
类型时,会自动忽略空白字符,包括空格、制表符、回车等。
因此可以直接利用这个特性,统计总共读入多少个非空白字符即可。
C++ 代码:
#include <iostream> using namespace std; int main() { char c; int s = 0; while (cin >> c) s++; cout << s << endl; return 0; }
另外,牛客暑期NOIP真题班限时免费报名
报名链接:https://www.nowcoder.com/courses/cover/live/248
报名优惠券:DCYxdCJ