Contest3924 - 计科23级算法设计与分析平时作业-03

news/2025/3/28 16:30:27/文章来源:https://www.cnblogs.com/Thin-time/p/18790660

题目链接

A.Knight Moves

题面

思路

马的bfs、最短路径问题。模板题

示例代码

#include<bits/stdc++.h>using namespace std;#define ll long long
//#define int ll
#define pii pair<int, int>
#define all(x) x.begin(),x.end()
#define fer(i, m, n) for(int i = m; i < n; ++i)
#define ferd(i, m, n) for(int i = m; i >= n; --i)
#define dbg(x) cout << #x << ' ' << char(61) << ' ' << x << '\n'const int MOD = 1e9 + 7;
const int N = 2e5 + 2;
const int inf = 1e9;struct point{int x, y;point(int x, int y) : x(x), y(y) {}
};int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};void dfs(string start, string end) {if(start == end) {cout << "To get from " << start << " to " << end << " takes " << 0 << " knight moves.\n";return;}queue<point> q;point start_point(start[0] - 'a', start[1] - '1'), end_point(end[0] - 'a', end[1] - '1');q.push(start_point);vector<vector<bool>> vis(8, vector<bool>(8, false));vis[start_point.x][start_point.y] = true;vector<vector<int>> dist(8, vector<int>(8, inf));dist[start_point.x][start_point.y] = 0;while(!q.empty()) {point curr = q.front();q.pop();if(curr.x == end_point.x && curr.y == end_point.y) {cout << "To get from " << start << " to " << end << " takes " << dist[curr.x][curr.y] << " knight moves.\n";return;}fer(i, 0, 8){int nx = curr.x + dx[i], ny = curr.y + dy[i];auto OnRange = [] (int a, int b) {return a >= 0 && a < 8 && b >= 0 && b < 8;};if(OnRange(nx, ny) && !vis[nx][ny]) {if(dist[curr.x][curr.y] + 1 < dist[nx][ny]) {dist[nx][ny] = dist[curr.x][curr.y] + 1;q.push({nx, ny});vis[nx][ny] = true;}}}}}signed main() {ios::sync_with_stdio(false); cin.tie(nullptr);string s1, s2;while(cin >> s1 >> s2) {dfs(s1, s2);}return 0;
}

B.Gold Transportation

题面

示例代码

#include <bits/stdc++.h>using namespace std;#define ll long long
// #define int ll
#define pii pair<int, int>
#define all(x) x.begin(), x.end()
#define fer(i, m, n) for (int i = m; i < n; ++i)
#define ferd(i, m, n) for (int i = m; i >= n; --i)
#define dbg(x) cout << #x << ' ' << char(61) << ' ' << x << '\n'const int inf = 0x3f3f3f3f;
const int N = 1001, M = 100001;int head[N], nex[M], to[M], val[M], now;
void add(int a, int b, int v)
{to[++now] = b;val[now] = v;nex[now] = head[a];head[a] = now;to[++now] = a;val[now] = 0;nex[now] = head[b];head[b] = now;
}//*********************int sp, ep, d[N];int bfs()
{queue<int> Q;memset(d, -1, sizeof(d));d[sp] = 0;Q.push(sp);while (!Q.empty()){int p = Q.front();Q.pop();for (int i = head[p]; ~i; i = nex[i]){int u = to[i];if (d[u] == -1 && val[i] > 0){d[u] = d[p] + 1;Q.push(u);}}}return d[ep] != -1;
}int dfs(int p, int v)
{int r = 0;if (p == ep)return v;for (int i = head[p]; (~i) && r < v; i = nex[i]){int u = to[i];if (val[i] > 0 && d[u] == d[p] + 1){int x = dfs(u, min(val[i], v - r));r += x;val[i] -= x;val[i ^ 1] += x;}}if (!r)d[p] = -2;return r;
}int dinic()
{int ans = 0, t;while (bfs()){while (t = dfs(sp, inf))ans += t;}return ans;
}//***********************void init()
{now = -1; // 要求第一条边为0memset(head, -1, sizeof(head));
}int n, m, sum;
int a[M], b[M], v[M];
int s[N], g[N];int judge(int limit)
{init();sp = 0, ep = 201;for (int i = 1; i <= m; i++){if (v[i] <= limit){add(a[i], b[i], inf);add(b[i], a[i], inf);}}for (int i = 1; i <= n; i++){if (s[i]){add(0, i, s[i]);}if (g[i]){add(i, 201, g[i]);}}int ans = dinic();if (ans == sum)return 1;return 0;
}int main()
{while (scanf("%d", &n) != EOF){if (!n)break;sum = 0;for (int i = 1; i <= n; i++)scanf("%d", s + i), sum += s[i];for (int i = 1; i <= n; i++)scanf("%d", g + i);scanf("%d", &m);int l = 0, r = 1e4;for (int i = 1; i <= m; i++)scanf("%d%d%d", a + i, b + i, v + i);if (!judge(1e4)){printf("No Solution\n");continue;}if (judge(0)){printf("%d\n", 0);continue;}while (r - l > 1){int mid = l + r >> 1;if (judge(mid))r = mid;elsel = mid;}printf("%d\n", r);}
}

C.Function Run Fun

题面

思路

记忆化搜索

示例代码

#include<bits/stdc++.h>using namespace std;#define ll long long
//#define int ll
#define pii pair<int, int>
#define all(x) x.begin(),x.end()
#define fer(i, m, n) for(int i = m; i < n; ++i)
#define ferd(i, m, n) for(int i = m; i >= n; --i)
#define dbg(x) cout << #x << ' ' << char(61) << ' ' << x << '\n'const int MOD = 1e9 + 7;
const int N = 2e5 + 2;
const int inf = 1e9;ll memo[100][100][100];ll w(int a, int b, int c) {if(a <= 0 || b <= 0 || c <= 0) return 1;if(memo[a][b][c] != -1) return memo[a][b][c];if(a > 20 || b > 20 || c > 20)a = b = c = 20, memo[a][b][c] = w(20, 20, 20);else if(a < b && b < c) memo[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);else memo[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);return memo[a][b][c];
}signed main() {//ios::sync_with_stdio(false); cin.tie(nullptr);int a, b, c;memset(memo, -1, sizeof(memo));while(cin >> a >> b >> c) {if(a == -1 && b == -1 && c == -1) break;printf("w(%d, %d, %d) = %lld\n", a, b, c, w(a, b, c));}return 0;
}

D.Equation Solver

题面

示例代码

#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;const double EPS = 1e-8;pair<double, double> parse_expression(const string& s, int& pos);
pair<double, double> parse_term(const string& s, int& pos);
pair<double, double> parse_factor(const string& s, int& pos);int parse_number(const string& s, int& pos) {int num = 0;while (pos < s.size() && isdigit(s[pos])) {num = num * 10 + (s[pos] - '0');pos++;}return num;
}pair<double, double> parse_factor(const string& s, int& pos) {if (s[pos] == 'x') {pos++;return {1.0, 0.0};} else if (isdigit(s[pos])) {int num = parse_number(s, pos);return {0.0, (double)num};} else if (s[pos] == '(') {pos++;auto res = parse_expression(s, pos);if (pos < s.size() && s[pos] == ')') {pos++;}return res;} else {return {0.0, 0.0};}
}pair<double, double> parse_term(const string& s, int& pos) {auto res = parse_factor(s, pos);double a = res.first, b = res.second;while (pos < s.size() && s[pos] == '*') {pos++;auto factor = parse_factor(s, pos);double new_a = a * factor.second + b * factor.first;double new_b = b * factor.second;a = new_a;b = new_b;}return {a, b};
}pair<double, double> parse_expression(const string& s, int& pos) {pair<double, double> res = {0.0, 0.0};bool positive = true;if (pos < s.size() && (s[pos] == '+' || s[pos] == '-')) {positive = (s[pos] == '+');pos++;}auto term = parse_term(s, pos);if (!positive) {term.first *= -1;term.second *= -1;}res.first = term.first;res.second = term.second;while (pos < s.size() && (s[pos] == '+' || s[pos] == '-')) {char op = s[pos];pos++;auto term = parse_term(s, pos);if (op == '+') {res.first += term.first;res.second += term.second;} else {res.first -= term.first;res.second -= term.second;}}return res;
}int main() {string line;int case_num = 1;while (getline(cin, line)) {int eq_pos = line.find('=');string left_str = line.substr(0, eq_pos);string right_str = line.substr(eq_pos + 1);int pos = 0;auto left = parse_expression(left_str, pos);pos = 0;auto right = parse_expression(right_str, pos);double total_a = left.first - right.first;double total_b = right.second - left.second;cout << "Equation #" << case_num << endl;if (fabs(total_a) < EPS) {if (fabs(total_b) < EPS) {cout << "Infinitely many solutions." << endl;} else {cout << "No solution." << endl;}} else {double x = total_b / total_a;if(abs(x) <1e-9) x = abs(x);cout << "x = " << fixed << setprecision(6) << x << endl;}cout << endl;case_num++;}return 0;
}

E.Triangular Sums

题面

思路

加权求和,直接模拟即可

示例代码

#include<bits/stdc++.h>using namespace std;#define ll long long
//#define int ll
#define pii pair<int, int>
#define all(x) x.begin(),x.end()
#define fer(i, m, n) for(int i = m; i < n; ++i)
#define ferd(i, m, n) for(int i = m; i >= n; --i)
#define dbg(x) cout << #x << ' ' << char(61) << ' ' << x << '\n'const int MOD = 1e9 + 7;
const int N = 2e5 + 2;
const int inf = 1e9;signed main() {ios::sync_with_stdio(false); cin.tie(nullptr);int t;cin >> t;fer(i, 1, t + 1) {int n;cin >> n;ll ans = 0;fer(k, 1, n + 1) ans += k * (1 + k + 1) * (k + 1) / 2;cout << i << ' ' << n << ' ' << ans << '\n';}return 0;
}

F.W‘s Cipher

题面

思路

将字符串字符分成三组,将每组进行循环移位,注意处理空组串的情况

示例代码

#include<bits/stdc++.h>using namespace std;#define ll long long
//#define int ll
#define pii pair<int, int>
#define all(x) x.begin(),x.end()
#define fer(i, m, n) for(int i = m; i < n; ++i)
#define ferd(i, m, n) for(int i = m; i >= n; --i)
#define dbg(x) cout << #x << ' ' << char(61) << ' ' << x << '\n'const int MOD = 1e9 + 7;
const int N = 2e5 + 2;
const int inf = 1e9;void fun(string &s, int k) {k %= s.size();if(k < 0) k += s.size();s = s.substr(s.size() - k) + s.substr(0, s.size() - k);
}signed main() {ios::sync_with_stdio(false); cin.tie(nullptr);int k1, k2, k3;while(cin >> k1 >> k2 >> k3, k1 || k2 || k3) {string s;cin >> s;vector<int> table(s.size());string s1, s2, s3;fer(i, 0, s.size()) {if(s[i] >= 'a' && s[i] <= 'i') table[i] = 1, s1 += s[i];else if(s[i] >= 'j' && s[i] <= 'r') table[i] = 2, s2 += s[i];else table[i] = 3, s3 += s[i];}if(s1.size()) fun(s1, k1);if(s2.size()) fun(s2, k2);if(s3.size()) fun(s3, k3);string ans;int ind1 = 0, ind2 = 0, ind3 = 0;fer(i, 0, s.size()) {if(table[i] == 1) ans += s1[ind1++];else if(table[i] == 2) ans += s2[ind2++];else ans += s3[ind3++];}cout << ans << '\n';}return 0;
}

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

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

相关文章

UML之包含用例

UML提供include机制避免用例重复,实现共享。本文介绍创建被包含用例的步骤,并通过实例展示其在基础用例共享、复杂用例分解及继承用例复用等场景下的应用。对于规模较大的用例,建模过程中经常会发现多个用例存在共享相同的子目标或子行为的情况。为避免重复并实现共享,UML提…

基于ESP32的物联网传感器和超声波距离传感器,Watmonitor可进行实时水位监测

Watmonitor是一个使用物联网传感器进行实时水位监测的自托管应用程序,具有多语言支持和易于访问的数据。Watmonitor是一个多功能的、自托管的web应用程序,专为实时水位监测而设计。使用基于ESP32的物联网传感器和超声波距离传感器,它可以跟踪各种环境中的水位,如水井,水箱…

【Java】【SpringBoot】Quartz——动态任务调度

回顾:前面学习了quartz的基础使用:https://www.cnblogs.com/luyj00436/p/18781141 定时任务可能是按照预设的时间进行。可是实际中,我们肯定希望自由的进行任务生成、暂停、恢复、删除、更新等操作。 Quartz本身没有提供动态调度的功能,需要自己根据相关的API开发。 场景订…

GrapeCity Documents V8.0 新版本特性

GcExcel V8.0 新版本特性丰富,包括:数据导入方面,可从多种数据源(如自定义对象、DataTable 等)导入,为 IRange.ImportData (..) 新增重载;假设分析上,通过 IWorksheet.Scenarios 接口支持 “方案” 功能,可进行多种操作且受保护工作表也能编辑;数据透视表能绑定表格数…

如何寻找替代FTP传输文件的软件,解决文件传输难题?

FTP因其操作简单、客户端种类多、价格低廉(甚至免费)等优势,受到众多企业的青睐,在全世界范围内得到广泛的应用。但它也面临着一些安全和效率方面的挑战,因此企业都在寻找可平滑替代FTP传输文件的软件。有以下局限性: 1.安全性弱:明文传输,漏洞频发,容易遭到DOS攻击;…

20244205 《Python程序设计》实验一报告

课程:《Python程序设计》 班级: 2442 姓名: 高赫 学号:20244205 实验教师:王志强 实验日期:2025年3月24日 必修/选修: 公选课 1.实验内容 (1).熟悉Python开发环境; (2).练习Python运行、调试技能; (3).编写程序,练习变量和类型、字符串、对象、缩进和注释等; (4).编…

微积分的本质——导数.18790288

本篇为3b1b系列【微积分的本质】笔记 原视频:02-导数的悖论 | 03-用几何来求导 | 04-直观理解链式法则和乘积法则定义导数 这是一个随着时间变化,车辆行驶距离的坐标图在横轴的任何一个点\(t\)上,如果你去查看车的车速表,上面都有一个数字表示当前的车速,但这是如何计算的…

推荐8款 .NET 开源、免费、实用的 Windows 效率软件

前言 今天大姚给大家推荐8款基于 .NET 开源、免费、实用的 Windows 效率软件,开发工作提升利器,希望可以帮助到有需要的小伙伴。 DevToys DevToys是一个专门为开发者设计的Windows工具箱,完全支持离线运行,无需使用许多不真实的网站来处理你的数据,常用功能有:格式化(支…

解密prompt系列51. R1实验的一些细节讨论

DeepSeek R1出来后业界都在争相复现R1的效果,这一章我们介绍两个复现项目SimpleRL和LogicRL,还有研究模型推理能力的Cognitive Behaviour,项目在复现R1的同时还针对R1训练策略中的几个关键点进行了讨论和消融实验,包括DeepSeek R1出来后业界都在争相复现R1的效果,这一章我…

读DAMA数据管理知识体系指南30文件和内容治理

读DAMA数据管理知识体系指南30文件和内容治理1. 方法 1.1. 诉讼应诉手册1.1.1. 电子取证工作一般在发生诉讼的时候进行1.1.2. 指引应明确电子取证的目标环境,并评估当前环境和目标环境之间是否存在差距1.1.3. 应记载电子取证活动生命周期的业务流程,明确电子取证团队的角色和…

为什么springboot的jar可以直接启动

一、讲述 1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。 2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的 类。 3.java -jar会去找jar中的manifest文件,在那里面找…