From 3bde00039c79c8517c253d8dc155246a2865bf4e Mon Sep 17 00:00:00 2001 From: e2hang <2099307493@qq.com> Date: Sun, 21 Sep 2025 12:21:50 +0800 Subject: [PATCH] Algo-Trian --- ...19 [USACO1.5] 八皇后 Checker Challenge.cpp | 51 +++++++++++++ .../BigNum/P1601 A+B Problem(高精).cpp | 35 +++++++++ .../P12141 [蓝桥杯 2025 省 A] 假红黑树.cpp | 28 ++++++++ Algorithm/Bit/全排列.cpp | 35 +++++++++ .../Linear-DP/P1115 最大子段和.cpp | 22 ++++++ .../P12143 [蓝桥杯 2025 省 A] 好串的数目.cpp | 31 ++++++++ .../Linear-DP/P2285 [HNOI2004] 打鼹鼠.cpp | 36 ++++++++++ .../Linear-DP/转化成一维O(n)是极好的 | 0 .../DP-DynamicProgramming/P1807 最长路.cpp | 42 +++++++++++ .../DP-DynamicProgramming/P3916 图的遍历.cpp | 61 ++++++++++++++++ .../P2241 统计方形(数据加强版).cpp | 1 + Algorithm/Graph/BFS/P1443 马的遍历.cpp | 48 +++++++++++++ .../Graph/Bellman-Ford有负边的最短路径.cpp | 48 +++++++++++++ .../DFS/P1036 [NOIP 2002 普及组] 选数.cpp | 39 ++++++++++ Algorithm/Graph/Dijkstra最短路径.cpp | 46 ++++++++++++ Algorithm/Graph/Floyd两点之间最短路径.cpp | 37 ++++++++++ Algorithm/Graph/Kruskal最小生成树.cpp | 72 +++++++++++++++++++ .../P4779 【模板】单源最短路径(标准版).cpp | 9 +++ .../Graph/P5318 【深基18.例3】查找文献.cpp | 51 +++++++++++++ .../P1031 [NOIP 2002 提高组] 均分纸牌.cpp | 26 +++++++ .../P1090 [NOIP 2004 提高组] 合并果子.cpp | 26 +++++++ Algorithm/Greedy/P1106 删数问题.cpp | 39 ++++++++++ Algorithm/Greedy/一定要找对贪心策略 | 0 .../P8218 【深进1.例1】求区间和.cpp | 25 +++++++ Algorithm/Sort/P1496 火烧赤壁.cpp | 34 +++++++++ 25 files changed, 842 insertions(+) create mode 100644 Algorithm/BackTracking/P1219 [USACO1.5] 八皇后 Checker Challenge.cpp create mode 100644 Algorithm/BigNum/P1601 A+B Problem(高精).cpp create mode 100644 Algorithm/Bit/P12141 [蓝桥杯 2025 省 A] 假红黑树.cpp create mode 100644 Algorithm/Bit/全排列.cpp create mode 100644 Algorithm/DP-DynamicProgramming/Linear-DP/P1115 最大子段和.cpp create mode 100644 Algorithm/DP-DynamicProgramming/Linear-DP/P12143 [蓝桥杯 2025 省 A] 好串的数目.cpp create mode 100644 Algorithm/DP-DynamicProgramming/Linear-DP/P2285 [HNOI2004] 打鼹鼠.cpp create mode 100644 Algorithm/DP-DynamicProgramming/Linear-DP/转化成一维O(n)是极好的 create mode 100644 Algorithm/DP-DynamicProgramming/P1807 最长路.cpp create mode 100644 Algorithm/DP-DynamicProgramming/P3916 图的遍历.cpp create mode 100644 Algorithm/Enumerate/P2241 统计方形(数据加强版).cpp create mode 100644 Algorithm/Graph/BFS/P1443 马的遍历.cpp create mode 100644 Algorithm/Graph/Bellman-Ford有负边的最短路径.cpp create mode 100644 Algorithm/Graph/DFS/P1036 [NOIP 2002 普及组] 选数.cpp create mode 100644 Algorithm/Graph/Dijkstra最短路径.cpp create mode 100644 Algorithm/Graph/Floyd两点之间最短路径.cpp create mode 100644 Algorithm/Graph/Kruskal最小生成树.cpp create mode 100644 Algorithm/Graph/P4779 【模板】单源最短路径(标准版).cpp create mode 100644 Algorithm/Graph/P5318 【深基18.例3】查找文献.cpp create mode 100644 Algorithm/Greedy/P1031 [NOIP 2002 提高组] 均分纸牌.cpp create mode 100644 Algorithm/Greedy/P1090 [NOIP 2004 提高组] 合并果子.cpp create mode 100644 Algorithm/Greedy/P1106 删数问题.cpp create mode 100644 Algorithm/Greedy/一定要找对贪心策略 create mode 100644 Algorithm/PrefixAndSuffix/P8218 【深进1.例1】求区间和.cpp create mode 100644 Algorithm/Sort/P1496 火烧赤壁.cpp diff --git a/Algorithm/BackTracking/P1219 [USACO1.5] 八皇后 Checker Challenge.cpp b/Algorithm/BackTracking/P1219 [USACO1.5] 八皇后 Checker Challenge.cpp new file mode 100644 index 0000000..3e1af6d --- /dev/null +++ b/Algorithm/BackTracking/P1219 [USACO1.5] 八皇后 Checker Challenge.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +using namespace std; +set> result; + +bool check(const vector& path, int pos) { + int row = path.size(); // ǰҪŵ + for (int i = 0; i < row; i++) { + // ͬ ڶԽ + if (path[i] == pos || abs(path[i] - pos) == row - i) { + return false; + } + } + return true; +} + +void dfs(vector& path_, int n){ + if(path_.size() == n){ + result.emplace(path_); + return; + } + + int js = 0; + for(int i = 0; i < n; i++) + { + if(check(path_, i)){ + js++; + path_.push_back(i); + dfs(path_, n); + path_.pop_back(); + } + } + +} +int main(){ + int n; + cin >> n; + vector path; + dfs(path, n); + auto it = result.begin(); + for(int i = 0; i < 3; i++){ + for(auto x : *it){ + cout << x + 1 << " "; + } + cout << endl; + it++; + } + cout << result.size() << endl; + return 0; +} diff --git a/Algorithm/BigNum/P1601 A+B Problem(高精).cpp b/Algorithm/BigNum/P1601 A+B Problem(高精).cpp new file mode 100644 index 0000000..2796967 --- /dev/null +++ b/Algorithm/BigNum/P1601 A+B Problem(高精).cpp @@ -0,0 +1,35 @@ +#include +#include +#include +using namespace std; + +string add(string a, string b) { + reverse(a.begin(), a.end()); + reverse(b.begin(), b.end()); + + int ms = max(a.size(), b.size()); + string tmp; + tmp.resize(ms + 1, '0'); + + int carry = 0; + for (int i = 0; i < ms; i++) { + int x = (i < a.size() ? a[i] - '0' : 0); + int y = (i < b.size() ? b[i] - '0' : 0); + int sum = x + y + carry; + tmp[i] = sum % 10 + '0'; + carry = sum / 10; + } + if (carry) tmp[ms] = carry + '0'; + else tmp.pop_back(); + + reverse(tmp.begin(), tmp.end()); + return tmp; +} + +int main() { + string a, b; + cin >> a >> b; + cout << add(a, b) << endl; + return 0; +} + diff --git a/Algorithm/Bit/P12141 [蓝桥杯 2025 省 A] 假红黑树.cpp b/Algorithm/Bit/P12141 [蓝桥杯 2025 省 A] 假红黑树.cpp new file mode 100644 index 0000000..74ba2b7 --- /dev/null +++ b/Algorithm/Bit/P12141 [蓝桥杯 2025 省 A] 假红黑树.cpp @@ -0,0 +1,28 @@ +#include +#include +using namespace std; +int checkbin(long long s){ + int js = 0; + while(s){ + js += (s & 1); + s = s>> 1; + } + return js; +} +int main(){ + int n; + cin >> n; + vector s(n); + for(int i = 0; i < n; i++){ + int a, b; + cin >> a >> b; + s[i] = ( 1 << (a - 1) ) + (b - 1); + } + for(int i = 0; i < n; i++){ + if(checkbin(s[i]) % 2 == 0) cout << "BLACK" << endl; + else cout << "RED" << endl; + } + return 0; +} + + diff --git a/Algorithm/Bit/全排列.cpp b/Algorithm/Bit/全排列.cpp new file mode 100644 index 0000000..c854068 --- /dev/null +++ b/Algorithm/Bit/全排列.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +using namespace std; +vector> result; +void dfs(vector& path, vector& used, int n){ + int js = 0; + for(int i = 0; i < n; i++){ + if(used[i] == false){ + js++; + used[i] = true; + path.push_back(i); + dfs(path, used, n); + path.pop_back(); + used[i] = false; + } + } + if(js == 0){ + result.push_back(path); + return; + } +} +int main(){ + int n; + cin >> n; + vector path; + vector used(n, false); + dfs(path, used, n); + for(auto x : result){ + for(auto y: x){ + cout << setw(5) << y + 1; + } + cout << endl; + } +} diff --git a/Algorithm/DP-DynamicProgramming/Linear-DP/P1115 最大子段和.cpp b/Algorithm/DP-DynamicProgramming/Linear-DP/P1115 最大子段和.cpp new file mode 100644 index 0000000..570a382 --- /dev/null +++ b/Algorithm/DP-DynamicProgramming/Linear-DP/P1115 最大子段和.cpp @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include +using namespace std; +const int INF = INT_MAX >> 1; +int main() { + int n; + cin >> n; + vector a(n); + vector dp(n + 1, -INF); + for (int i = 0; i < n; i++) { + cin >> a[i]; + } + dp[0] = 0; + for (int i = 1; i < n + 1; i++) { + dp[i] = max(dp[i - 1] + a[i - 1], a[i - 1]); + } + cout << *max_element(dp.begin() + 1, dp.end()) << endl; + return 0; +} diff --git a/Algorithm/DP-DynamicProgramming/Linear-DP/P12143 [蓝桥杯 2025 省 A] 好串的数目.cpp b/Algorithm/DP-DynamicProgramming/Linear-DP/P12143 [蓝桥杯 2025 省 A] 好串的数目.cpp new file mode 100644 index 0000000..05478ff --- /dev/null +++ b/Algorithm/DP-DynamicProgramming/Linear-DP/P12143 [蓝桥杯 2025 省 A] 好串的数目.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +using namespace std; +int main(){ + ios::sync_with_stdio(false); + cin.tie(nullptr); + + string s; + cin >> s; + int n = s.size(); + vector dp(n, 1); + //dp[i]: iβַ + //ַӴȻַ + //Ԥ + for(int i = 1; i < n; i++){ + if(s[i] == s[i - 1] + 1 || s[i] == s[i - 1]){ + dp[i] = dp[i - 1] + 1; + } + } + //Ҫݳ⣬ôֶ + int sum = 0; + for(int i = 0; i < n; i++){ + //Լ + sum += (dp[i] - 1) * dp[i] / 2; + //ǰһ + sum += dp[i] * (i - dp[i]); + } + cout << sum << endl; + return 0; +} diff --git a/Algorithm/DP-DynamicProgramming/Linear-DP/P2285 [HNOI2004] 打鼹鼠.cpp b/Algorithm/DP-DynamicProgramming/Linear-DP/P2285 [HNOI2004] 打鼹鼠.cpp new file mode 100644 index 0000000..3e2609e --- /dev/null +++ b/Algorithm/DP-DynamicProgramming/Linear-DP/P2285 [HNOI2004] 打鼹鼠.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +using namespace std; +//tuple(t, x, y) +int dist(const tuple& i, const tuple& j){ + return ( abs(get<1>(i) - get<1>(j)) + abs(get<2>(i) - get<2>(j)) ); +} +int time(const tuple& i, const tuple& j){ + return abs( get<0>(i) - get<0>(j) ); +} +int main(){ + int n, m; + cin >> n >> m; + //n * n, m + vector> ham(m); + vector dp(m, 1); + for(int i = 0; i < m; i++){ + int t, x, y; + cin >> t >> x >> y; + ham[i] = make_tuple(t, x, y); + } + //dp[m] = max (ߵ(t2 - t1 > dist)dp[x] + 1) + for(int i = 1; i < m; i++){ + for(int j = 0; j < i; j++){ + //ߵ͸ + if(dist(ham[i], ham[j]) <= time(ham[i], ham[j])){ + dp[i] = max(dp[i], dp[j] + 1); + } + } + } + cout << *max_element(dp.begin(), dp.end()) << endl; + return 0; +} diff --git a/Algorithm/DP-DynamicProgramming/Linear-DP/转化成一维O(n)是极好的 b/Algorithm/DP-DynamicProgramming/Linear-DP/转化成一维O(n)是极好的 new file mode 100644 index 0000000..e69de29 diff --git a/Algorithm/DP-DynamicProgramming/P1807 最长路.cpp b/Algorithm/DP-DynamicProgramming/P1807 最长路.cpp new file mode 100644 index 0000000..a63fa50 --- /dev/null +++ b/Algorithm/DP-DynamicProgramming/P1807 最长路.cpp @@ -0,0 +1,42 @@ +#include +#include +using namespace std; + +const int NEG_INF = -1e9; + +int main() { + int v, e; + cin >> v >> e; + + vector> dp(v, vector(v, NEG_INF)); + for (int i = 0; i < v; i++) dp[i][i] = 0; // Ի=0 + + for (int i = 0; i < e; i++) { + int a, b, w; + cin >> a >> b >> w; + dp[a - 1][b - 1] = max(dp[a - 1][b - 1], w); // ܶߣȡ + } + + for (int k = 0; k < v; k++) { + for (int i = 0; i < v; i++) { + if (dp[i][k] <= NEG_INF / 2) continue; + for (int j = 0; j < v; j++) { + if (dp[k][j] <= NEG_INF / 2) continue; + dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j]); + } + } + } + + int mx = -1; + for (int i = 0; i < v; i++) { + for (int j = 0; j < v; j++) { + if (dp[i][j] > NEG_INF / 2) { + mx = max(mx, dp[i][j]); + } + } + } + + mx == -1 ? cout << mx << endl; + return 0; +} + diff --git a/Algorithm/DP-DynamicProgramming/P3916 图的遍历.cpp b/Algorithm/DP-DynamicProgramming/P3916 图的遍历.cpp new file mode 100644 index 0000000..85d629d --- /dev/null +++ b/Algorithm/DP-DynamicProgramming/P3916 图的遍历.cpp @@ -0,0 +1,61 @@ +#include +#include +using namespace std; +int main(){ + //dpֻO(n3)bfsdfs + int v, e; + cin >> v >> e; + //vector> adj(v, vector()); + vector> dp(v, vector(v, false)); + for(int i = 0; i < e; i++){ + int a, b; + cin >> a >> b; + //adj[a - 1].push_back(b - 1); + //adj[b - 1].push_back(a - 1); + dp[a - 1][b - 1] = true; + } + //dp[i][j] : Ƿͨȡkķʽ + for (int i = 0; i < v; i++) dp[i][i] = true; // ԼԼͨ + for(int k = 0; k < v; k++){ + for(int i = 0; i < v; i++){ + for(int j = 0; j < v; j++){ + if(dp[i][j]) continue; + dp[i][j] = dp[i][j] || (dp[i][k] & dp[k][j]); + } + } + } + + //bfs + for(int i = 0; i < v; i++) { + vector visited(v, false); + queue q; + q.push(i); + visited[i] = true; + int mx = i; + while (!q.empty()) { + int curr = q.front(); + q.pop(); + for (int next : adj[curr]) { + if (!visited[next]) { + visited[next] = true; + q.push(next); + mx = max(mx, next); + } + } + } + cout << mx + 1 << " "; +} + + + + + for(int i = 0; i < v; i++){ + int mx = -1; + for(int j = 0; j < v; j++){ + if(dp[i][j] && mx < j) mx = j; + } + cout << mx + 1 << " "; + } + cout << endl; + return 0; +} diff --git a/Algorithm/Enumerate/P2241 统计方形(数据加强版).cpp b/Algorithm/Enumerate/P2241 统计方形(数据加强版).cpp new file mode 100644 index 0000000..604782e --- /dev/null +++ b/Algorithm/Enumerate/P2241 统计方形(数据加强版).cpp @@ -0,0 +1 @@ +#include diff --git a/Algorithm/Graph/BFS/P1443 马的遍历.cpp b/Algorithm/Graph/BFS/P1443 马的遍历.cpp new file mode 100644 index 0000000..fd88c02 --- /dev/null +++ b/Algorithm/Graph/BFS/P1443 马的遍历.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +using namespace std; + +const int INF = INT_MAX >> 1; +int dx[] = {1, 2, 2, 1, -1, -2, -2, -1}; +int dy[] = {2, 1, -1, -2, -2, -1, 1, 2}; + +bool check(int bx, int by, int x, int y) { + return (x >= 0 && x < bx && y >= 0 && y < by); +} + +int main() { + int n, m, x, y; + cin >> n >> m >> x >> y; + vector> mp(n, vector(m, INF)); + + x--; y--; // ת 0-based + queue> q; + q.push({x, y, 0}); + mp[x][y] = 0; + + while (!q.empty()) { + auto [qx, qy, path] = q.front(); + q.pop(); + + for (int i = 0; i < 8; i++) { + int nx = qx + dx[i]; + int ny = qy + dy[i]; + if (check(n, m, nx, ny) && mp[nx][ny] == INF) { + mp[nx][ny] = path + 1; + q.push({nx, ny, path + 1}); + } + } + } + + for (auto &row : mp) { + for (auto v : row) { + cout << (v == INF ? -1 : v) << " "; + } + cout << "\n"; + } + return 0; +} + diff --git a/Algorithm/Graph/Bellman-Ford有负边的最短路径.cpp b/Algorithm/Graph/Bellman-Ford有负边的最短路径.cpp new file mode 100644 index 0000000..70fc01f --- /dev/null +++ b/Algorithm/Graph/Bellman-Ford有负边的最短路径.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include +using namespace std; +const int INF = INT_MAX >> 1; +int main(){ + int n, edge_num, start; + cin >> n >> edge_num >> start; + + //Ҫadj, Ҫdp edges + vector> edges(edge_num);// p1, p2, w + vector dp(n, INF); + dp[start] = 0; + + // + for(int i = 0; i < edge_num; i++){ + int a, b, w; + cin >> a >> b >> w; + edges[i] = {a, b, w}; + } + + //Ƚn - 1 + for(int i = 0; i < n - 1; i++){ + for(auto [p1, p2, w] : edges){ + if(dp[p2] > dp[p1] + w){ + dp[p2] = dp[p1] + w; + } + } + } + + //Ƿи + bool negcc = false; + for(auto [p1, p2, w] : edges){ + if(dp[p2] > dp[p1] + w){ + negcc = true; + break; + } + } + + if(negcc) cout << "Negative Circle Detected" << endl; + else{ + for(auto x : dp){ + cout << x << " "; + } + } + return 0; +} diff --git a/Algorithm/Graph/DFS/P1036 [NOIP 2002 普及组] 选数.cpp b/Algorithm/Graph/DFS/P1036 [NOIP 2002 普及组] 选数.cpp new file mode 100644 index 0000000..2cac3ac --- /dev/null +++ b/Algorithm/Graph/DFS/P1036 [NOIP 2002 普及组] 选数.cpp @@ -0,0 +1,39 @@ +#include +#include +using namespace std; + +int js = 0; +vector arr; + +bool checkprime(int x) { + if (x < 2) return false; + for (int i = 2; i * i <= x; i++) { + if (x % i == 0) return false; + } + return true; +} + +void dfs(int idx, int k, int sum) { + if (k == 0) { // Ѿѡk + if (checkprime(sum)) js++; + return; + } + if (idx >= arr.size()) return; + + // ѡǰ + dfs(idx + 1, k - 1, sum + arr[idx]); + // ѡǰ + dfs(idx + 1, k, sum); +} + +int main() { + int n, k; + cin >> n >> k; + arr.resize(n); + for (int i = 0; i < n; i++) cin >> arr[i]; + + dfs(0, k, 0); + cout << js << endl; + return 0; +} + diff --git a/Algorithm/Graph/Dijkstra最短路径.cpp b/Algorithm/Graph/Dijkstra最短路径.cpp new file mode 100644 index 0000000..493bfff --- /dev/null +++ b/Algorithm/Graph/Dijkstra最短路径.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include +using namespace std; +const int INF = INT_MAX >> 1; +int main(){ + int n, edge_num, start; + cin >> n >> edge_num >> start; + vector>> adj(n); + priority_queue, vector>, greater>> dp; + vector used(n, false); + vector dist(n, INF); + + for(int i = 0; i < edge_num; i++){ + int a, b, w; + cin >> a >> b >> w; + adj[a].push_back({b, w}); + adj[b].push_back({a, w}); + } + dp.push({0, start}); + dist[start] = 0; + + while(!dp.empty()){ + //ȷѡ + auto[dists, v] = dp.top(); + dp.pop(); + if(used[v]) continue; + used[v] = true; + + //ǵ + for(auto [u, d] : adj[v]){ + if(!used[u] && dist[v] + d < dist[u]){//С + dist[u] = dist[v] + d; + dp.push({dist[u], u}); + } + } + } + + for(auto x : dist){ + if(x != INF) cout << x << " "; + else cout << "INF" << " "; + } + cout << endl; + return 0; +} diff --git a/Algorithm/Graph/Floyd两点之间最短路径.cpp b/Algorithm/Graph/Floyd两点之间最短路径.cpp new file mode 100644 index 0000000..7f24089 --- /dev/null +++ b/Algorithm/Graph/Floyd两点之间最短路径.cpp @@ -0,0 +1,37 @@ +#include +#include +#include +using namespace std; +const int INF = 100001;// +int main(){ + //dpķֽ׶д(ӽṹصֶ) + int n, edge_num, start, end; + cin >> n >> edge_num >> start >> end; + //ش洢 + //vector> edge(edge_num); + vector> dp(n, vector(n, INF)); + + for(int i = 0; i < edge_num; i++){ + int a, b, w; + cin >> a >> b >> w; + //edge[i] = {a, b, w}; + dp[a][b] = w; + } + + //dp, һkд + for(int k = 0; k < n; k++){ + for(int i = 0; i < n; i++){ + for(int j = 0; j < n; j++){ + dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]); + } + } + } + for(int k = 0; k < n; k++){ + if(dp[k][k] < 0){ + cout << "Negative Cycle Detected!" << endl; + return 0; + } + } + cout << dp[start][end] << endl; + return 0; +} diff --git a/Algorithm/Graph/Kruskal最小生成树.cpp b/Algorithm/Graph/Kruskal最小生成树.cpp new file mode 100644 index 0000000..9dc9e8e --- /dev/null +++ b/Algorithm/Graph/Kruskal最小生成树.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +using namespace std; +vector parent; +struct edge{ + int from; + int to; + int weight; + + edge() : from(-1), to(-1), weight(-1){} + edge(int from_, int to_, int weight_): from(from_), to(to_), weight(weight_){} +}; +struct cmp{ + bool operator()(const edge& a, const edge& b){ + return a.weight < b.weight; + } +}; + +int find(int x){ + if(parent[x] != x) parent[x] = find(parent[x]); + return parent[x]; +} +void merge(int x, int y){ + int rootX = find(x); + int rootY = find(y); + if(rootX != rootY) parent[rootY] = rootX; + return; +} + +int main(){ + //adjķʽ + int n; + cin >> n; + //vector>> adj(n, vector>());//û + parent.resize(n); + for(int i = 0; i < n; i++){ + parent[i] = i; + } + + vector> result(n, {-1, -1}); + int path = 0; + int edge_num; + cin >> edge_num; + vector arr(edge_num); + for(int i = 0; i < edge_num; i++){ + int a, b, w; + cin >> a >> b >> w; + arr[i] = edge(a, b, w);//һ + } + if(edge_num < n - 1) { + cout << "Not Valid Full Graph" << endl; + return ; + } + + sort(arr.begin(), arr.end(), cmp()); + for(auto x : arr){ + if(find(x.from) == find(x.to)){ + continue; + } + merge(x.from, x.to); + result.push_back({x.from, x.to}); + path += x.weight; + } + cout << path << endl; + for(auto x : result){ + if(x.first != -1 && x.second != -1) cout << "{" << x.first << ", " << x.second << "}" << " "; + } + cout << endl; + return 0; +} diff --git a/Algorithm/Graph/P4779 【模板】单源最短路径(标准版).cpp b/Algorithm/Graph/P4779 【模板】单源最短路径(标准版).cpp new file mode 100644 index 0000000..d1d0272 --- /dev/null +++ b/Algorithm/Graph/P4779 【模板】单源最短路径(标准版).cpp @@ -0,0 +1,9 @@ +#include +#include +using namespace std; +int main(){ + int v, e, start; + cin >> v >> e >> start; + vector map(v, 0); + return 0; +} diff --git a/Algorithm/Graph/P5318 【深基18.例3】查找文献.cpp b/Algorithm/Graph/P5318 【深基18.例3】查找文献.cpp new file mode 100644 index 0000000..164e75d --- /dev/null +++ b/Algorithm/Graph/P5318 【深基18.例3】查找文献.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +using namespace std; +vector> adj; +vector used; +// +void dfs(int idx){ + if(used[idx]) return; + used[idx] = true; // ѷ + cout << idx + 1 << " "; + + for(auto x : adj[idx]){ + dfs(x); + } +} + +int main(){ + int v, e; + cin >> v >> e; + adj.resize(v); + used.resize(v, false); + for(int i = 0; i < e; i++){ + int a, b; + cin >> a >> b; + adj[a - 1].push_back(b - 1); + } + for(int i = 0; i < v; i++){ + sort(adj[i].begin(), adj[i].end()); + } + dfs(0); + fill(used.begin(), used.end(), false); + + cout << endl; + //bfs + deque q; + q.push_back(0); + used[0] = true; + while(!q.empty()){ + int top = q.front(); q.pop_front(); // ע front() + cout << top + 1 << " "; + for(auto x : adj[top]){ + if(!used[x]){ + used[x] = true; // Ƿ + q.push_back(x); + } + } + } + return 0; +} diff --git a/Algorithm/Greedy/P1031 [NOIP 2002 提高组] 均分纸牌.cpp b/Algorithm/Greedy/P1031 [NOIP 2002 提高组] 均分纸牌.cpp new file mode 100644 index 0000000..8ebfe78 --- /dev/null +++ b/Algorithm/Greedy/P1031 [NOIP 2002 提高组] 均分纸牌.cpp @@ -0,0 +1,26 @@ +#include +#include +#include +using namespace std; +int main(){ + int n; + cin >> n; + vector a(n); + int sum = 0; + for(int i = 0; i < n; i++){ + cin >> a[i]; + sum += a[i]; + } + int avg = sum / n; + int js = 0; + for(int i = 0; i < n - 1; i++){ + if(a[i] != avg){ + int tmp = a[i] - avg; + a[i] = avg; + a[i + 1] += tmp; + js++; + } + } + cout << js << endl; + return 0; +} diff --git a/Algorithm/Greedy/P1090 [NOIP 2004 提高组] 合并果子.cpp b/Algorithm/Greedy/P1090 [NOIP 2004 提高组] 合并果子.cpp new file mode 100644 index 0000000..66d084d --- /dev/null +++ b/Algorithm/Greedy/P1090 [NOIP 2004 提高组] 合并果子.cpp @@ -0,0 +1,26 @@ +#include +#include +using namespace std; +int main(){ + ios::sync_with_stdio(false); + cin.tie(nullptr); + int n; + cin >> n; + priority_queue, greater> q; + for(int i = 0; i < n; i++){ + int a; + cin >> a; + q.emplace(a); + } + int value = 0; + int min1 = 0, min2 = 0; + while(q.size() > 1){ + min1 = q.top(); q.pop(); + min2 = q.top(); q.pop(); + int tmp = min1 + min2; + value += tmp; + q.emplace(tmp); + } + cout << value<< endl; + return 0; +} diff --git a/Algorithm/Greedy/P1106 删数问题.cpp b/Algorithm/Greedy/P1106 删数问题.cpp new file mode 100644 index 0000000..c64260f --- /dev/null +++ b/Algorithm/Greedy/P1106 删数问题.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +using namespace std; + +int main() { + string s; + int k; + cin >> s >> k; + deque q; + + for(char curr : s) { + while(!q.empty() && k > 0 && q.back() > curr){ + q.pop_back(); + k--; + } + q.push_back(curr); + } + + // ʣ k ֣ɾջβ + while(k > 0 && !q.empty()) { + q.pop_back(); + k--; + } + + // ƴӽ + string res; + for(char c : q) res += c; + + // ȥǰ + int i = 0; + while(i < res.size() && res[i] == '0') i++; + res = res.substr(i); + if(res.empty()) res = "0"; + + cout << res << endl; + return 0; +} + diff --git a/Algorithm/Greedy/一定要找对贪心策略 b/Algorithm/Greedy/一定要找对贪心策略 new file mode 100644 index 0000000..e69de29 diff --git a/Algorithm/PrefixAndSuffix/P8218 【深进1.例1】求区间和.cpp b/Algorithm/PrefixAndSuffix/P8218 【深进1.例1】求区间和.cpp new file mode 100644 index 0000000..204cce0 --- /dev/null +++ b/Algorithm/PrefixAndSuffix/P8218 【深进1.例1】求区间和.cpp @@ -0,0 +1,25 @@ +#include +#include +#include +using namespace std; +int main() { + int n; + cin >> n; + vector sum(n + 1); + sum[0] = 0; + for (int i = 1; i < n + 1; i++) { + int tmp; + cin >> tmp; + sum[i] = sum[i - 1] + tmp; + } + int cnum; + cin >> cnum; + vector> check(cnum); + for (int i = 0; i < cnum; i++) { + cin >> check[i].first >> check[i].second; + } + for (int i = 0; i < cnum; i++) { + cout << sum[check[i].second] - sum[check[i].first - 1] << endl; + } + return 0; +} diff --git a/Algorithm/Sort/P1496 火烧赤壁.cpp b/Algorithm/Sort/P1496 火烧赤壁.cpp new file mode 100644 index 0000000..3bc7289 --- /dev/null +++ b/Algorithm/Sort/P1496 火烧赤壁.cpp @@ -0,0 +1,34 @@ +#include +#include +#include +#include +using namespace std; +struct cmp{ + bool operator()(const pair& a, const pair& b){ + return a.first < b.first; + } +}; +int main(){ + int n; + cin >> n; + vector> dp(n); + // + for(int i = 0; i < n; i++){ + cin >> dp[i].first >> dp[i].second; + } + //dp.first + sort(dp.begin(), dp.end(), cmp()); + vector> merge; + for(auto [l, r] : dp){ + if (merged.empty() || merged.back().second < l) + merged.push_back({l,r}); + else + merged.back().second = max(merged.back().second, r); + } + int sum = 0; + for(auto [l, r] : merge){ + sum += r - l; + } + cout << sum << endl; + return 0; +}