CSP-S储备Day1

基础算法

枚举:框定一个范围,遍历其中的所有东西.
搜索:从一个初始状态出发,一步一步走到相邻的状态
枚举优化:1.改变枚举对象.
2.倒叙枚举.
3.减少枚举量.

题1:颜色统计

#include <iostream>using namespace std;
const int maxn = 2e5 + 10;int c[maxn];
int vis[maxn];
int pre[maxn];int main()
{int n;cin >> n;for (int i = 1; i <= n; ++i){cin >> c[i];pre[c[i]] = vis[i];vis[c[i]] = i;}long long ans = 0;for (int i = 1; i <= n; ++i){ans += (i - pre[i]) * (n - i + 1);}cout << ans << '\n';return 0;
}

题2: 取模

#include <iostream>
#include <algorithm>using namespace std;
const int maxn = 2e5 + 10;int tong[(int)(1e8 + 3)];
int a[maxn];
int b[maxn];int main()
{int n;cin >> n;int maxx = -1;for (int i = 1; i <= n; ++i){cin >> a[i];tong[a[i]]++;maxx = max(maxx, a[i]);}int len = 0;for (int i = 1; i <= maxx; ++i){int cnt = 0;while (tong[i] > 0 && cnt <= 2){cnt++;a[++len] = i;tong[i]--;}}n = len;sort(a + 1, a + n + 1);int ans = -1;for (int k = n; k >= 1; --k){if (ans >= a[k])break;for (int i = 1; i <= n; ++i){b[i] = a[i] % a[k];}sort(b + 1, b + n + 1);for (int i = 1; i <= n; ++i){b[i] = b[i + 1];}ans = max(ans, b[n - 1] + b[n - 2] - a[k]);for (int i = 1, j = n - 1; j >= i; ++i){while (b[i] >= a[k] - b[j] && j >= i){j--;}ans = max(ans, b[i] + b[j]);}}cout << ans << '\n';return 0;
}

题3: 讨论

DFS:一条路走到黑,回溯(好写,层数深会T).
BFS:同一层的位置同时遍历到,队列维护,求最优解(可行性与最优性问题,同一层的数据多会M).

题4: 生日蛋糕

#include <iostream>using namespace std;
typedef long long ll;
const int N = 2e4 + 10;
const int M = 30;int n, m;
ll ans = 1e18 + 7;
ll minv[M], mins[M];void dfs(int idx, ll nows, ll nowv, int lstr, int lsth)
{if (idx == 0){if (nowv == n)ans = min(ans, nows);return;}if (nows + mins[idx] > ans)return;if (nowv + minv[idx] > n)return;ll maxv = 0;for (int i = 1; i <= idx; ++i)maxv += (lstr - i) * (lstr - i) * (lsth - i);if (nowv + maxv < n)return;for (int i = idx; i < lstr; ++i){for (int j = idx; j < lsth; ++j){dfs(idx - 1, nows + 2 * i * j, nowv + i * i * j, i, j);}}
}int main()
{cin >> n >> m;for (int i = 1; i <= m; ++i){minv[i] = minv[i - 1] + i * i * i;mins[i] = mins[i - 1] + 2 * i * i;}for (int i = m; i * i <= n; ++i){for (int j = m; j <= n / i / i; ++j){dfs(m - 1, i * i + 2 * i * j, i * i * j, i, j);}}if (ans == (ll)(1e18 + 7))cout << 0 << '\n';elsecout << ans << '\n';return 0;
}

剪枝:为什么大佬想到了我这个蒟蒻没想到呢?菜就多练.一些明显会使接下来不合法的策略可以舍弃.

题5: 滑雪

#include <iostream>
#include <cstring>using namespace std;
const int maxn = 110;int n, m;
int dx[maxn] = {-1, 1, 0, 0};
int dy[maxn] = {0, 0, 1, -1};
int a[maxn][maxn];
int f[maxn][maxn];int dfs(int x, int y)
{if (f[x][y])return f[x][y];f[x][y] = 1;for (int i = 0; i <= 3; ++i){if (x + dx[i] >= 1 && x + dx[i] <= n && y + dy[i] >= 1 && y + dy[i] <= m)if (a[x][y] > a[x + dx[i]][y + dy[i]])f[x][y] = max(dfs(x + dx[i], y + dy[i]) + 1, f[x][y]);}return f[x][y];
}int main()
{cin >> n >> m;for (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){cin >> a[i][j];}}int ans = 0;for (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){ans = max(ans, dfs(i, j));}}cout << ans << '\n';return 0;
}

\(\text{A}^*\) 启发式搜索,基于 \(Dijstra\) 的贪心:用一个 \(g\) 表示已经获得的价值,用一个 \(h\) 表示从当前状态走到最终状态的理论最优价值.令 \(f = g + h\) 那么 \(f\) 是估价函数(估计的总价值),我们向 \(f\) 最小的地方走,如果 \(f > 当前的 ans\) ,就回头;如果有多条路径可以走,那么我们走 \(f\) 最小的.当 \(h = 0\) 时,这就是个 \(dijstra\) ,当边权为 \(0\) ,这就是个 \(dfs\) .
记忆化搜索:我们开一个数组 \(res[u]\) ,记录u这个状态出发到达最终状态的代价.那么我们走到每个点的次数就会大大减少了
双向广搜:从起点和终点同时或分别进行广搜,检查是否到达了相同的点,与折半搜索类似.
枚举子集:用 \(for\) 循环替代 \(dfs\) ,如果我们要枚举一个集合的所有子集,那我们可以把这个子集看作一个长度为全集大小的二进制串(一个位置选或不选). \((s >> 1) \& 1\) 取出这个二进制串从小到大的第 \(i(0 \le i < n)\) 位.

for (int S_ = S; S_; S_ = (S_ - 1) & S) //枚举了所有 S_ 包含于 S .

复杂度: \(O(3^n)\)
求所有子集的数的和的异或和.
\(dfs\) 或:

for (int i = 1; i <= 25; ++i)
{mem[1 << i] = i;
}
for (int i = 0; i < (1 << n); ++i)
{f[i] = f[i ^ lowbit(i)] + a[mem[lowbit(i)]];
}

归并排序: \(O(n\log n)\)
逆序对: 归并排序来求.
序列分治: 就像归并排序一样的思路:
1.合并:将分治两边处理完之后,在本层合并,有时候就是简单相加.
2.统计:统计完分支两边的答案,统计跨过 \(mid\) 的答案.
二维偏序:所有满足 \(a_i < a_j,b_i > b_j\) 的点对的数量,将 \(a_i\) 作为下表就行.
三维偏序:用树状数组.

题6:平面最近点对(加强版)

题7:Pudding Monsters

贪心:为什么大佬想到了我这个蒟蒻没想到呢?菜就多练.不断地找当前的最优解,最后发现刚好是全局最优解.
1.找到贪心算法.
2.验证它的正确性.

题8:SAM-Toy Cars

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>using namespace std;
const int P = 5e5 + 10;struct Node
{int id, num;friend bool operator < (const Node &a, const Node &b){return a.num < b.num;}
};bool vis[P];
int b[P];
int a[P];
int nxt[P];
priority_queue <Node> q;int main()
{int n, k, p;cin >> n >> k >> p;for (int i = 1; i <= p; ++i){cin >> a[i];nxt[b[a[i]]] = i;b[a[i]] = i;}for (int i = 1; i <= p; ++i)if(!nxt[i])nxt[i] = 0x3f3f3f3f;int ans = 0;for (int i = 1; i <= p; ++i){if (vis[a[i]]){++k;q.push((Node){i, nxt[i]});continue;}if (q.size() < k){++ans;q.push((Node){i, nxt[i]});vis[a[i]] = true;continue;}Node now = q.top();q.pop();++ans;vis[a[now.id]] = false;vis[a[i]] = true;q.push((Node){i, nxt[i]});}cout << ans << '\n';return 0;
}

二分: \(l,mid,r\) 的艺术.

题9:导弹拦截

题10:Max Median

#include <iostream>using namespace std;
const int N = 1e6 + 10;
const int M = 1e6 + 10;int n, k;
int a[N];
int d[M], s[M], t[M];
int cf[M];
int sum[M];bool check(int mid)
{sum[0] = 0;for (int i = 1; i <= n; ++i){sum[i] = sum[i - 1] + (a[i] >= mid);}int mn = 1e9;for (int l = 0, r = k; r <= n; ++r){while (r - l >= k){mn = min(mn, 2 * sum[l] - l);++l;}if (2 * sum[r] - r > mn){return true;}}return false;
}int main()
{cin >> n >> k;for (int i = 1; i <= n; ++i){cin >> a[i];}int l = 0, r = n, mid, ans = 0;while (l <= r){mid = (l + r) >> 1;if (check(mid)){ans = mid;l = mid + 1;}else{r = mid - 1;}}cout << ans << '\n';return 0;
}

题10:借教室

#include <iostream>
#include <cstring>
#define int long longusing namespace std;
const int N = 1e6 + 10;
const int M = 1e6 + 10;int n, m;
int r[N];
int d[M], s[M], t[M];
int need[M];
int cf[M];bool check(int mid)
{memset(cf, 0, sizeof(cf));for (int i = 1; i <= mid; ++i){cf[s[i]] += d[i];cf[t[i] + 1] -= d[i];}for (int i = 1; i <= n; ++i){need[i] = need[i - 1] + cf[i];if (need[i] > r[i]){return false;}}return true;
}signed main()
{cin >> n >> m;for (int i = 1; i <= n; ++i){cin >> r[i];}for (int i = 1; i <= m; ++i){cin >> d[i] >> s[i] >> t[i];}int l = 1, r = m, mid, ans = -1;while (l <= r){mid = (l + r) >> 1;if (check(mid)){l = mid + 1;}else{ans = mid;r = mid - 1;}}if (ans == -1){cout << 0 << '\n';}else{cout << -1 << '\n';cout << ans << '\n';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873434.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java编程规范-常量定义

常量定义规范【强制】常量不允许任何魔法值(即未经定义的常量)直接出现在代码中。 反例: String key = "Id#taobao_" + tradeId; cache.put(key, value);【强制】long 或者 Long 初始赋值时,必须使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解…

2025省选模拟8

2025省选模拟8题目来源: 2024省选联测10 \(T1\) HZTG5836. 小幸运 \(18pts\)将坐标扩大 \(2\) 倍后答案只可能为整数,证明显然。二分答案, \(check\) 时考虑 \(2-SAT\) 。将一个点可能构成的等腰直角三角形划分成如下四个部分,最终仅能选择相邻的两个。不妨两条对角线上的取…

2025临沂一中强基考试游记

大烂特烂,故作此篇。 友情出演:王茂 *:八下年级rk1、常年年级前五。 范明 *:实力不详,遇强则强,至少比我强。 张晨 *:考过全区rk1,磕头。 公续 *、刘子 *:仅次于王张的大神。 韩梓 *:六边形战士。 张嘉 *、左世 *:实力不是很清楚( 比我强就对了Day -2 被我妈施压了…

对象池框架 commons pool2 原理与实践

当资源对象的创建/销毁比较耗时的场景下,可以通过"池化"技术,达到资源的复用,以此来减少系统的开销、增大系统吞吐量,比如数据库连接池、线程池、Redis 连接池等都是使用的该方式。 Apache Commons Pool 提供了通用对象池的实现,用于管理和复用对象,以提高系统…

20252025临沂一中强基考试游记

大烂特烂,故作此篇。 友情出演:王茂 *:八下年级rk1、常年年级前五 范明 *:实力不详,遇强则强,比我水平高 张晨 *:考过全区rk1,磕头 公续 *、刘子 *:仅次于王张的大神 韩梓 *:六边形战士 张嘉 *、左世 *:实力不是很清楚( 比我强就对了Day -2 被我妈施压了,说是考不…

【大厂文章学习】合并编译的学习与思考

合并编译通过将微服务的远程调用优化为本地函数调用,显著降低CPU开销和容器资源需求,但需权衡服务隔离、版本管理等挑战,适用于资源密集、调用关系紧密的场景。【大厂文章学习】合并编译的学习与思考【微信文章】字节跳动合并编译实践通过将微服务转换为本地函数调用的方式优…

安全帽识别摄像机

安全帽识别摄像机在建筑工地安全管理中具有重要意义。在高空作业、机械作业等危险环境下,佩戴安全帽是保障工人生命安全的重要措施。通过部署这种设备,系统可以实时监测工地内的作业人员,并自动识别出未佩戴安全帽的情况,及时发送警报通知现场管理人员进行处理,有效预防事…

监狱视频监控行为智能预警系统

监狱视频监控行为智能预警系统通过在监狱围墙、监舍、走廊、习艺楼等区域部署摄像机,监狱视频监控行为智能预警系统实现了对监狱内部的全方位、全天候监测。系统对连续的行为动作进行有效判断精准识别出离床、攀高、独处、倒地、斗殴、徘徊、滞留、逆行、聚众、静坐不动、入厕…

Spring-AOP(面向切面编程)

Spring-AOP(面向切面编程)面向切面编程(Aspect Oriented Programming-AOP)是面向对象编程(Object Oriented Programming-OOP)的一种补充,二者是互补的编程范式。在OOP中,关键单元是类,而在AOP中关键单元则是横切关注点。面向对象编程关注于将现实世界中的实体抽象为对象,并…

Java的控制流程

Java的控制流程 1. Scanner对象Java.util.Scanner 是Java5的新特性,我们可以通过Scanner类来获取用户的输入。 基本语法: Scanner s = new Scanner(System.in); 通过Scanner类的next() 与nextLine()方法获取输入的字符串,在读取我们一般需要 使用 hasNext() 与 hasNextLine…

【Java安全】基础汇总

一、JAVA安全 1.1 java的序列化和反序列化 Java 序列化是指把 Java 对象转换为字节序列的过程ObjectOutputStream类的 writeObject() 方法可以实现序列化 Java 反序列化是指把字节序列恢复为 Java 对象的过程ObjectInputStream 类的 readObject() 方法用于反序列化。 1、序列化…

云计算和服务器

一、云计算概述 ICT是世界电信协会在2001年的全球性会议上提出的综合性概念,ICT分为IT和CT,IT(information technology)信息技术,负责对数据生命周期的管理;CT(communication technology),负责数据的传输管理。 CT技术是ICT技术栈的底核。 1、计算机 计算机是现代一种…