【2024年码蹄杯】本科组省赛

在这里插入图片描述

个人主页:Guiat
归属专栏:算法竞赛

在这里插入图片描述

正文

总共8道题。

1. MC0355 · 开篇签到

【题目】 MC0355 · 开篇签到

【分析】
输出严格次小值。

【AC_Code】

#include <iostream>
#include <algorithm>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

const int N = 1e5 + 10; int a[N];

void solve()
{
	int n; cin >> n; for (int i = 0; i < n; i ++) cin >> a[i];
	sort(a, a + n); int pos = 0;
	for (int i = 0; i < n; i ++) if (a[i] == a[0]) pos ++;
	cout << a[pos] << '\n';
}

int main()
{
	IOS int _ = 1;   // cin >> _;
	while (_ --) solve();
	
	return 0;
}

2. MC0357 · 移动移动移动

【题目】MC0357 · 移动移动移动

【分析】

考察贪心。

全是1的串直接加,剩余不全为1的串只保留一边连续1长度的最大值。

【AC_Code】

#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

int cnt1, cnt2, m1, m2, ans;

void solve()
{
	int n; cin >> n;
	for (int i = 0; i < n; i ++)
	{
		string s; cin >> s; cnt1 = 0; cnt2 = 0;
		for (int i = 0; i < s.length() && s[i] == '1'; i ++) cnt1 ++;
		for (int i = s.length() - 1; i >= 0 && s[i] == '1'; i --) cnt2 ++;
		if (cnt1 == s.size()) ans += cnt1;
		else { m1 = max(cnt1, m1); m2 = max(cnt2, m2); }
	}
	cout << ans + max(m1, m2) << '\n';
}

int main()
{
	IOS int _ = 1;   // cin >> _;
	while (_ --) solve();
	
	return 0;
}

3. MC0357 · 移动移动移动

【题目】MC0357 · 移动移动移动

【分析】

考察:逆元、快速幂、阶乘预处理、逆元求组合数。

【AC_Code】

#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;
using ll = long long;

const ll N = 3e5 + 10, mod = 998244353;

ll f[N], inf[N];

ll ksm(ll a, ll b)
{
    ll res = 1;
    while (b)
	{
        if (b & 1) { res = res * a % mod; }
        a = a * a % mod; b >>= 1;
    }
    return res;
}

ll inv(ll a) { return ksm(a, mod - 2); }

ll C(ll a, ll b) { return f[a] * inf[b] % mod * inf[a - b] % mod; }

void init()
{
    f[0] = inf[0] = 1;
    for (ll i = 1; i <= N; i++)
	{
        f[i] = f[i - 1] * i % mod;
		inf[i] = inf[i - 1] * inv(i) % mod;
    }
}

void solve()
{
    int x1, y1, x2, y2, n, p, q; cin >> x1 >> y1 >> x2 >> y2 >> n >> p >> q;
    ll cx = x2 - x1, cy = y2 - y1;
    if (cx + cy > n || cx < 0 || cy < 0) return cout << 0 << '\n', void();
    ll ans = C(n, cx) * ksm(p * inv(100) % mod, cx) % mod * ksm(q * inv(100) % mod, n - cx) % mod;
    cout << ans << '\n';
}

int main()
{
    IOS init(); ll t = 1; cin >> t;
    while (t --) solve();

    return 0;
}

4. MC0358 · 请相信我会做图论

【题目】MC0358 · 请相信我会做图论

【分析】

考查图论dfs。

【AC_Code】

#include <iostream>
#include <algorithm>
#include <vector>
#define int long long
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;
using pii = pair<int, int>;

const int N = 1e5 + 10; int w[N], vis[N], ans; vector<int> u[N];

void dfs(int a)
{
	if (vis[a]) return ; vis[a] = 1;
	for (int i = 0; i < u[a].size(); i ++)
	{
		int next = u[a][i]; w[next] = min(w[a], w[next]);
		dfs(next);
	}
}

bool cmp(pii& a, pii& b) { return a.second < b.second; }

void solve()
{
	int n, m; cin >> n >> m; pii t[n + 1];
	for (int i = 1; i <= n; i ++) cin >> w[i], t[i].first = w[i], t[i].second = i;
	while (m --) { int a, b; cin >> a >> b; u[a].push_back(b); }
	sort(t + 1, t + n + 1);
	for (int i = 0; i < n; i ++) dfs(t[i].second);
	for (int i = 1; i <= n; i ++) ans += w[i]; cout << ans << '\n';
	for (int i = 1; i <= n; i ++) cout << w[i] << " \n"[i == n];
}

signed main()
{
	IOS int _ = 1;   // cin >> _;
	while (_ --) solve();
	
	return 0;
}

5. MC0359 · 我会等差数列

【题目】MC0359 · 我会等差数列

【分析】

前缀和 + 二分查找临界位置 + 处理特殊情况。

【AC_Code】

#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

const int N = 1e6 + 10; int n, q, a[N], f[N]; long pre[N];

void init()
{
	f[1] = 1; f[2] = 2;
	for (int i = 3; i <= n; i ++)
	{
		if (a[i] + a[i - 2] == 2 * a[i - 1]) f[i] = f[i - 1] + 1;
		else f[i] = 2;
	}
	for (int i = 1; i <= n; i ++) pre[i] = pre[i - 1] + f[i];
}

void solve()
{
	cin >> n >> q; for (int i = 1; i <= n; i ++) cin >> a[i]; init();
	while (q --)
	{
		int l, r; cin >> l >> r;
		if (f[r] >= r - l + 1)
		{
			cout << long(r - l + 1) * (r - l + 2) / 2 << '\n'; continue;
		}
		int _l = l, _r = r;
		while (_l < _r)
		{
			int mid = (_l + _r) >> 1;
			if (f[mid] < mid - l + 1) _r = mid;
			else _l = mid + 1;
		}
		cout << pre[r] - pre[_l - 1] + long(_l - l) * (_l - l + 1) / 2 << '\n';
	}
}

int main()
{
	IOS int _ = 1;   // cin >> _;
	while (_ --) solve();
	
	return 0;
}

6. MC0360 · 我会修改图

【题目】MC0360 · 我会修改图

【分析】

离线 + 并查集 + 启发式合并。

【AC_Code】

#include <bits/stdc++.h>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

const int N = 2e5 + 10, M = 4e5 + 10;
int a[N], s[N], edg[M][2], op[M][3]; bool del[M];
map<int, int> cnt[N]; vector<int> ans;

int find(int u) { return u == s[u] ? u : s[u] = find(s[u]); }

void merge(int u, int v)
{
    u = find(u); v = find(v);
    if (u == v) return ;
    if (cnt[u].size() < cnt[v].size()) swap(u, v);
    s[v] = u;
    for (const auto& pair : cnt[v])
	{
        int w = pair.first, c = pair.second; cnt[u][w] += c;
    }
}

void solve()
{
    int n, m, q; cin >> n >> m >> q;
    for (int i = 1; i <= n; i ++) { cin >> a[i]; s[i] = i; cnt[i][a[i]] = 1; }
    for (int i = 1; i <= m; i ++) cin >> edg[i][0] >> edg[i][1];
    for (int i = 1; i <= q; i ++)
    {
        cin >> op[i][0] >> op[i][1];
        if (op[i][0] == 2) cin >> op[i][2];
        else del[op[i][1]] = true;
    }
    for (int i = 1; i <= m; i ++)
    {
        if (del[i]) continue;
        merge(edg[i][0], edg[i][1]);
    }
    for (int i = q; i >= 1; i --)
    {
        if (op[i][0] == 1) { int x = op[i][1]; merge(edg[x][0], edg[x][1]); }
        else
        {
            int x = op[i][1], y = op[i][2], u = find(x), target = y - a[x];
            int count = cnt[u].count(target) ? cnt[u][target] : 0;
            ans.push_back(count - (a[x] == target ? 1 : 0));
        }
    }
    reverse(ans.begin(), ans.end()); for (int x : ans) cout << x << '\n';
}

int main()
{
    IOS int _ = 1;   // cin >> _;
    while (_ --) solve();
    
    return 0;
}

7. MC0361 · 团队能量

【题目】MC0361 · 团队能量

【分析】

【AC_Code】

#include <iostream>
#include <algorithm>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;
using ll = long long;

const int N = 1e6 + 10; ll n, k, a[N], f[N], M = 2e18;

void solve()
{
	int n, k; cin >> n >> k; for (int i = 1; i <= n; i ++) cin >> a[i];
	sort(a + 1, a + 1 + n);
	for (int i = 0; i <= n + 1; i ++) f[i] = M;
	f[0] = 0; f[2] = a[2] - a[1];
	for (int i = 3; i <= n; i ++)
	{
		f[i] = f[i - 2] + a[i] - a[i - 1];
		if (k <= 2) continue;
		f[i] = min(f[i], f[i - 3] + a[i] * 2 - a[i - 2] - a[i - 1]);
	}
	cout << f[n] << '\n';
}

int main()
{
	IOS int _ = 1;   // cin >> _;
	while (_ --) solve();
	
	return 0;
}

8. MC0362 · 异或

【题目】MC0362 · 异或

【分析】

【AC_Code】

#include <iostream>
#include <vector>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

const int N = 5e5 + 10, mod = 1e9 + 7;
int n, q, k, a[N], f[N][30][2], ans; vector<int> e[N], path { 0 };

void dfs(int u, int fa)
{
	path.push_back(u);
	for (int i = 0; i < 30; i ++)
	{
		f[u][i][a[u] >> i & 1] ++;
		f[path[max(0, (int)path.size() - k - 2)]][i][a[u] >> i & 1] --;
	}
	for (int v : e[u])
	{
		if (v == fa) continue;
		dfs(v, u);
	}
	path.pop_back();
}

void dfs_sum(int u, int fa)
{
	for (int v : e[u])
	{
		if (v == fa) continue;
		dfs_sum(v, u);
		for (int i = 0; i < 30; i ++) { f[u][i][0] += f[v][i][0]; f[u][i][1] += f[v][i][1]; }
	}
}

void solve()
{
	cin >> n >> q >> k; for (int i = 1; i <= n; i ++) cin >> a[i];
	for (int i = n - 1, u, v; i --; ) { cin >> u >> v; e[u].push_back(v); e[v].push_back(u); }
	dfs(1, 0); dfs_sum(1, 0);
	for (int x; q --; )
	{
		cin >> x; ans = 0;
		for (int i = 0; i < 30; i ++)
		{
			ans += f[x][i][0] * (1l << i) % mod * f[x][i][1] % mod;
			ans %= mod;
		}
		cout << ans << '\n';
	}
}

int main()
{
	IOS int _ = 1;   // cin >> _;
	while (_ --) solve();
	
	return 0;
}

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
是一项针对编程爱好者的竞活动,通常会涉及C语言的基础到高级知识点。以下是一些与马相关的C语言知识点总结,涵盖语法、数据结构、算法等方面: ### 3.1 基本语法 C语言的基本语法是编程的基础,包括变量定义、运算符、控制结构等。例如,定义一个整型变量并赋值: ```c int a = 10; ``` 条件判断语句如`if-else`用于根据条件执行不同的代块: ```c if (a > 0) { printf("Positive number"); } else { printf("Non-positive number"); } ``` 循环结构如`for`、`while`和`do-while`用于重复执行一段代,直到满足某个条件为止: ```c for (int i = 0; i < 5; i++) { printf("%d ", i); } ``` ### 3.2 数据类型与运算 C语言支持多种数据类型,包括基本类型如`int`、`float`、`char`等,以及派生类型如数、指针、结构体等。例如,定义一个字符数来存储字符串: ```c char str[] = "Hello, World!"; ``` 运算符包括算术运算符、关系运算符、逻辑运算符等。例如,使用`sizeof`运算符获取数据类型的大小: ```c printf("Size of int: %lu bytes\n", sizeof(int)); ``` ### 3.3 函数 函数是C语言中的基本模块,用于封装特定的功能。函数可以有参数也可以没有参数,并且可以返回一个值。例如,定义一个简单的函数来计算两个整数的和: ```c int add(int a, int b) { return a + b; } ``` 调用该函数的方法如下: ```c int result = add(3, 4); printf("Result: %d\n", result); ``` ### 3.4 指针 指针是C语言中非常重要的概念,它允许直接操作内存地址。指针变量存储的是另一个变量的地址。例如,定义一个指向整型的指针并初始化: ```c int *ptr; int a = 10; ptr = &a; ``` 通过指针访问变量的值: ```c printf("Value of a: %d\n", *ptr); ``` ### 3.5 数与字符串 数是一种线性数据结构,用于存储相同类型的元素。例如,定义一个整型数并初始化: ```c int arr[5] = {1, 2, 3, 4, 5}; ``` 字符串在C语言中是以字符数的形式表示的,以空字符`\0`结尾。例如,定义一个字符串: ```c char str[] = "Hello"; ``` ### 3.6 结构体与联合 结构体允许将不同类型的数据合在一起。例如,定义一个表示学生的结构体: ```c struct Student { char name[50]; int age; float gpa; }; ``` 联合与结构体类似,但所有成员共享同一块内存空间。例如,定义一个联合: ```c union Data { int i; float f; char str[20]; }; ``` ### 3.7 文件操作 文件操作是C语言中常见的任务,涉及文件的打开、读取、写入和关闭。例如,打开一个文件并写入数据: ```c FILE *fp; fp = fopen("test.txt", "w"); fprintf(fp, "This is a test file.\n"); fclose(fp); ``` ### 3.8 预处理器指令 预处理器指令用于在编译之前处理源代。常见的预处理器指令包括`#include`、`#define`等。例如,定义一个宏来计算两个数的最大值: ```c #define MAX(a, b) ((a) > (b) ? (a) : (b)) ``` ### 3.9 内存管理 C语言提供了动态内存分配的功能,允许在运行时分配和释放内存。常用的函数包括`malloc`、`calloc`、`realloc`和`free`。例如,动态分配一个整型数: ```c int *arr = (int *)malloc(5 * sizeof(int)); if (arr == NULL) { printf("Memory allocation failed\n"); exit(1); } ``` ### 3.10 常见错误与调试技巧 在编写C语言程序时,常见的错误包括语法错误、逻辑错误、内存泄漏等。调试技巧包括使用调试器、打印中间结果、逐步执行代等。例如,使用`printf`函数打印调试信息: ```c printf("Debug: Value of a = %d\n", a); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【Air】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值